/** * 正则表达式可以划分不同的组,取出组的名称,括号即可, 即所谓的捕获组 * 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)); } } }
上述完整源码下载地址