Java 正则表达式 量词 --- 三种匹配模式【贪婪型、勉强型、占有型】
2014-05-29 10:56
525 查看
在Sun的API中对在对 “最大匹配Greedy”“最小匹配Reluctant”“完全匹配Possessive”的描述,不能让我明白他们有什么区别,现在将我对这三种匹配模式的理解写出来,供大家参考。
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,}+等,成为完全匹配。它和最大匹配一样,一直匹配所有的字符,直到文本的最后,但它不由原路返回。也就是说,一口匹配,搞不定就算了,到也干脆,偶喜欢。
先看两端代码:
Java代码
String s = "/m/t/wd/nl/n/p/m/wd/nl/n/p/m/wd/nl/n/p/m/v/n";
Pattern p = Pattern.compile("/m/t.*/nl/n/p/m");
Matcher m = p.matcher(s);
while(m.find()) {
System.out.println(m.group());
System.out.println(m.start());
System.out.println(m.end());
}
运行结果:
/m/t/wd/nl/n/p/m/wd/nl/n/p/m/wd/nl/n/p/m
0
40
Java代码
String s = "/m/t/wd/nl/n/p/m/wd/nl/n/p/m/wd/nl/n/p/m/v/n";
Pattern p = Pattern.compile("/m/t.*?/nl/n/p/m");
Matcher m = p.matcher(s);
while(m.find()) {
System.out.println(m.group());
System.out.println(m.start());
System.out.println(m.end());
}
运行结果:
/m/t/wd/nl/n/p/m/wd/nl/n/p/m/wd/nl/n/p/m
0
40
只是在.*后加了一个“?”, 结果就大不一样了。 可以这样说,如果想贪婪匹配,用.*, 如果想勉强匹配,就用.*?。
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,}+等,成为完全匹配。它和最大匹配一样,一直匹配所有的字符,直到文本的最后,但它不由原路返回。也就是说,一口匹配,搞不定就算了,到也干脆,偶喜欢。
先看两端代码:
Java代码
String s = "/m/t/wd/nl/n/p/m/wd/nl/n/p/m/wd/nl/n/p/m/v/n";
Pattern p = Pattern.compile("/m/t.*/nl/n/p/m");
Matcher m = p.matcher(s);
while(m.find()) {
System.out.println(m.group());
System.out.println(m.start());
System.out.println(m.end());
}
运行结果:
/m/t/wd/nl/n/p/m/wd/nl/n/p/m/wd/nl/n/p/m
0
40
Java代码
String s = "/m/t/wd/nl/n/p/m/wd/nl/n/p/m/wd/nl/n/p/m/v/n";
Pattern p = Pattern.compile("/m/t.*?/nl/n/p/m");
Matcher m = p.matcher(s);
while(m.find()) {
System.out.println(m.group());
System.out.println(m.start());
System.out.println(m.end());
}
运行结果:
/m/t/wd/nl/n/p/m/wd/nl/n/p/m/wd/nl/n/p/m
0
40
只是在.*后加了一个“?”, 结果就大不一样了。 可以这样说,如果想贪婪匹配,用.*, 如果想勉强匹配,就用.*?。
相关文章推荐
- Java 正则表达式 量词 --- 三种匹配模式【贪婪型、勉强型、占有型】
- Java 正则表达式 量词 --- 三种匹配模式【贪婪型、勉强型、占有型】
- Java 正则表达式 量词 --- 三种匹配模式【贪婪型、勉强型、占有型】
- Java 正则表达式匹配模式(贪婪型、勉强型、占有型)
- Java正则表达式匹配模式[贪婪型、勉强型、占有型]
- Java正则表达式匹配模式[贪婪型、勉强型、占有型]
- java正则表达式匹配模式[贪婪型、勉强型、占有型]
- Java 正则表达式中量词的贪婪型,勉强型和占有型讲解
- java学习笔记001之正则表达式贪婪型、勉强型和占有型p299
- 正则表达式中量词贪婪型和勉强型的讨论(Java语言描述)
- 【转载】JAVA正则表达式的三种模式的区别-greedy reluctant possessive
- 正则表达式笔记 3 贪婪、勉强、独占三种匹配量词
- 正则表达式之量词与匹配模式
- Java - 正则表达式的运用(Pattern模式和Matcher匹配)
- 常用正则表达式匹配模式(java)
- Java学习笔记-正则表达式的模式匹配
- 正则表达式-量词的三种模式
- Java - 正则表达式的运用(Pattern模式和Matcher匹配)
- [ Java学习 ] 正则表达式与模式匹配
- Java - 正则表达式的运用(Pattern模式和Matcher匹配)—— 匹配中文,英文字母和数字及_长度详解——收集资源blog