正则表达式学习总结, 附java源码

本文深入探讨正则表达式的高级应用,包括组的概念、捕获与非捕获、或关系表达、贪婪与非贪婪匹配、字符替换、组引用、零宽度匹配等关键技巧。通过实例解析,揭示如何灵活运用正则表达式进行复杂匹配与操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 组的概念, 提取组信息

/** * 正则表达式可以划分不同的组,取出组的名称,括号即可, 即所谓的捕获组 * 1. 相关知识: 不捕获用(?:expression) 表示这组不需要捕获 * * */ public static void groupTest() { String src = "xxxxxxxxxx2009-1-17-19-07-16yyyyy2001-02-18-19-07-16q"; String regex = "(//w{4})(//d{4}-//d{1,2}-//d{1,2}-//d{1,2}-//d{1,2}-//d{1,2})"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(src); displayMatchResult(matcher); }

  • 或关系的表达

/** * 1. 单个字符或者数字的"或关系"用[]即可, 这里不做展示 * 2. 多个字符的"或关系"用括号展示 * 3. 提取括号的内容, 请看下面的例子, 关注group的index * 4. 这里的Group可以不捕获,不捕获的方式是(?:expression) * 5. 这里推出的问题是:"非逻辑关系怎么搞"(与逻辑关系就算了, 默认的都是与逻辑关系) * 6. 非关系, 归类到"零宽度"中 * */ public static void groupOr_Nested() { String src = "x1111abcxxxyyy"; String regex = "((?:x1111|y2222)abc)xxx"; //String regex = "((x1111|y2222)abc)xxx"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(src); displayMatchResult(matcher); }

  • 贪婪和非贪婪匹配

/** * 贪婪匹配和非贪婪匹配的比较 * 这是一个加不加问好的问题了 */ public static void greedCompare() { String src = "<p class=/"author/"> <strong>admin </strong></strong> 发表于 2009-5-14 16:49 </p><h3>提取帖子内容 </h3>“提取这句话”<br /> <br />"; /**非贪婪匹配用下面*/ //String regex = "<strong>(.*?)</strong>"; /**贪婪匹配用下面 */ String regex = "<strong>(.*)</strong>"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(src); displayMatchResult(matcher); }

  • 替换字符

/** * 替换, 该方法很水, 简单的可用, 复杂的 * 应该通过match.star(groupIndex)来找位置比较方便 */ public static void replaceMatch() { String src = "xxxxxxxxxx2009-1-17-19-07-16yyyyy2001-02-18-19-07-16q"; String regex = "(//w{4})(//d{4}-//d{1,2}-//d{1,2}-//d{1,2}-//d{1,2}-//d{1,2})"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(src); displayMatchResult(matcher); System.out.println(matcher.replaceFirst("---")); System.out.println(matcher.replaceAll("---")); }

  • 组的引用

/** * 群组的引用, 按照标号/1, /2的方式引用之前出现的内容 */ public static void group_reference() { String src = "love me love me xxxxxx"; String regex = "//b(//w+)//s+//b(//w+)//s+//1//s//2//b"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(src); displayMatchResult(matcher); }

  • 零宽度匹配之前向匹配

/*1. 零宽度, 即表达式的值不参与匹配结果*/ /** * 前面存在某项, 需要满足等于/不等于的条件 * (?<=expression) -------- (?<!expression) */ public static void zero_front() { String src = "xxxx---yyyhelloworldzzzz"; String regex = "(?<=yyy)helloworld"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(src); displayMatchResult(matcher); }

  • 零宽度匹配之后向匹配

/** * * 后面存在某项, 需要满足等于/不等于的条件 * (?=expression) -------- (?!expression) */ public static void zero_back() { String src = "xxxx---yyyhelloworldzzzz"; String regex = "helloworld(?=zzzz)"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(src); displayMatchResult(matcher); }

附注:

上述代码中展现结果的方法为:

/** * 打印匹配的结果 * 匹配了多少次 * 每次匹配的字符及Group的提取 * @param matcher */ private static void displayMatchResult(Matcher matcher) { int groupCount = matcher.groupCount(); int matchCount = 0; while (matcher.find()) { matchCount++; System.out.println("第" + matchCount + "次匹配成功"); for (int i = 0; i <= groupCount; i++) { //0表示所有的串 System.out.println("group index " + i + ":" + matcher.group(i).trim()); System.out.println("开始位置:" + matcher.start(i)); System.out.println("结束位置:" + matcher.end(i)); } } }

上述完整源码下载地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值