正则表达式学习总结, 附java源码
2010-05-28 21:21
786 查看
组的概念, 提取组信息
或关系的表达
贪婪和非贪婪匹配
替换字符
组的引用
零宽度匹配之前向匹配
零宽度匹配之后向匹配
附注:
上述代码中展现结果的方法为:
上述完整源码下载地址
/** * 正则表达式可以划分不同的组,取出组的名称,括号即可, 即所谓的捕获组 * 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)); } } }
上述完整源码下载地址
相关文章推荐
- Java之正则表达式学习总结
- java正则表达式学习总结,以及和javascript正则表达式的区别
- Java基础学习总结(4)——常用正则表达式列表
- Java 正则表达式学习总结和一些小例子
- Java 正则表达式学习总结和一些小例子
- 【黑马程序员】java正则表达式的学习和总结
- java正则表达式学习总结,以及和javascript正则表达式的区别
- java正则表达式学习总结,以及和javascript正则表达式的区别
- 黑马程序员学习log第九篇基础知识:JAVA的面向对象之正则表达式及反射总结
- java正则表达式学习总结!
- 【黑马程序员】java正则表达式学习总结
- Java 正则表达式学习总结和一些小例子
- Java 正则表达式学习总结和一些小例子
- Java基础学习总结(35)——Java正则表达式详解
- Java基础学习总结(21)——常用正则表达式列表
- Java 正则表达式学习总结和一些小例子
- Java 正则表达式学习总结和一些小例子
- Java 正则表达式学习总结和一些小例子
- java正则表达式学习总结,以及和javascript正则表达式的区别
- Java基础学习总结(35)——Java正则表达式详解