Java 正则表达式--匹配类型
2016-02-29 00:00
375 查看
1、Greediness(贪婪型): 最大匹配
X?、X*、X+、X{n,}都是最大匹配。例如你要用“<.+>”去匹配“a<tr>aava </tr>abb”,也许你所期待的结果是想匹配“<tr>”,但是实际结果却会匹配到“<tr>aava </tr>”。这是为什么呢?下面我们跟踪下最大匹配的匹配过程。
①“<”匹配字符串的“<”。②“.+”匹配字符串的“tr>aava </tr>ab”,在进行最大匹配时,它把两个“>”都匹配了,它匹配了所有字符,直到文本的最后字符“b” ③这时,发现不能成功匹配“>”,开始按原路回退,用“a”与“>”匹配,直到“ab”前面的“>”匹配成功。
这就是最大匹配,我们匹配的时候应该看最后面能匹配到哪。
代码示例:
输出:
2、Reluctant(Laziness)(勉强型):最小匹配
X?、X*、X+、X{n,}都是最大匹配。好,加个?就成了Laziness匹配。例如X??、X*?、X+?、X{n,}?都是最小匹配,其实X{n,m}?和X{n }?有些多余。
最小匹配意味者,.+? 匹配一个字符后,马上试一试>的匹配可能,失败了,则.+? 再匹配一个字符,再马上试一试>的匹配可能。JDK文档中Greedy 和 Reluctant,它是以eat一口来隐喻的,所以翻译成贪吃和(勉强的)厌食最贴切了。不过我喜欢最大匹配、最小匹配的说法。
代码示例:
输出:
和上面的不同是匹配了两处。
3、Possessive(占有型):完全匹配
与最大匹配不同,还有一种匹配形式:X?+、X*+、X++、X{n,}+等,成为完全匹配。它和最大匹配一样,一直匹配所有的字符,直到文本的最后,但它不由原路返回。也就是说,一口匹配,搞不定就算了,到也干脆,偶喜欢。
代码示例:
输出:
可见。完全匹配是最严格的,必须整个字符串匹配才行。
X?、X*、X+、X{n,}都是最大匹配。例如你要用“<.+>”去匹配“a<tr>aava </tr>abb”,也许你所期待的结果是想匹配“<tr>”,但是实际结果却会匹配到“<tr>aava </tr>”。这是为什么呢?下面我们跟踪下最大匹配的匹配过程。
①“<”匹配字符串的“<”。②“.+”匹配字符串的“tr>aava </tr>ab”,在进行最大匹配时,它把两个“>”都匹配了,它匹配了所有字符,直到文本的最后字符“b” ③这时,发现不能成功匹配“>”,开始按原路回退,用“a”与“>”匹配,直到“ab”前面的“>”匹配成功。
这就是最大匹配,我们匹配的时候应该看最后面能匹配到哪。
代码示例:
String test = "a<tr>aava </tr>abb "; String reg = "<.+>"; System.out.println(test.replaceAll(reg, "###"));
输出:
a###abb
2、Reluctant(Laziness)(勉强型):最小匹配
X?、X*、X+、X{n,}都是最大匹配。好,加个?就成了Laziness匹配。例如X??、X*?、X+?、X{n,}?都是最小匹配,其实X{n,m}?和X{n }?有些多余。
最小匹配意味者,.+? 匹配一个字符后,马上试一试>的匹配可能,失败了,则.+? 再匹配一个字符,再马上试一试>的匹配可能。JDK文档中Greedy 和 Reluctant,它是以eat一口来隐喻的,所以翻译成贪吃和(勉强的)厌食最贴切了。不过我喜欢最大匹配、最小匹配的说法。
代码示例:
String test = "a<tr>aava </tr>abb "; String reg = "<.+?>"; System.out.println(test.replaceAll(reg, "###"));
输出:
a###aava ###abb
和上面的不同是匹配了两处。
3、Possessive(占有型):完全匹配
与最大匹配不同,还有一种匹配形式:X?+、X*+、X++、X{n,}+等,成为完全匹配。它和最大匹配一样,一直匹配所有的字符,直到文本的最后,但它不由原路返回。也就是说,一口匹配,搞不定就算了,到也干脆,偶喜欢。
代码示例:
String test = "a<tr>aava </tr>abb "; String test2 = "<tr>"; String reg = "<.++>"; String reg2 = "<tr>"; System.out.println(test.replaceAll(reg, "###")); System.out.println(test2.replaceAll(reg2, "###"));
输出:
a<tr>aava </tr>abb
###
可见。完全匹配是最严格的,必须整个字符串匹配才行。
相关文章推荐
- java学习笔记:使用dom4j解析xml
- 拆解身份证的工具类
- java wordpress密码加密
- java自动类型转换
- Spring 中配置申明式的配置信息
- Java 集合系列目录(Category)
- Java 多线程系列目录(共43篇)
- openstack-ice版的eclipse环境配置
- Eclipse快捷键最有用的快捷键
- 浅谈Java中的hashcode方法
- Java中的内存泄漏
- java_patest乙级真题1002. 写出这个数 (20)
- Spring AOP学习笔记(3):AOP返回通知&异常通知&环绕通知
- [读书笔记]Java类加载过程
- 2016-2-28 Java学习笔记
- Berkeley db java 代码实例
- struts2+Hibernate4+spring3+EasyUI环境搭建之二:搭建spring
- java 序列化字节流解析
- Spring之不同步的Bean
- javaweb jsp页面上传excel文件