今天看《Thinking In java》正则表达式这一节量词有讲到量词特意写了一篇博客来总结。
量词的意思是:描述了一个模式吸入输入文本的方式
- 贪婪型 :java正则表达式默认匹配是贪婪型,就是原始表达式(x?),会 为所有可能的模式发现尽可能多的匹配。
Matcher m = Pattern.compile("x+")
.matcher("xxxxxx");
if(m.find())
System.out.println(m.group());
/*Oputput:
xxxxxx
*/
- 勉强型 :原始表达式后边加个?号(x+?),会匹配满足模式所需的最少字符数。
Matcher m = Pattern.compile("x+?")
.matcher("xxxxxx");
if(m.find())
System.out.println(m.group());
/*Output:
x
*/
- 占有型 :原始表达式后边加个+号(x++), 当正则表达式被应用于字符串时,他会产生相当多的状态,以便匹配失败时可以回溯。而“占有型”量词不会保存这些中间状态,因此他们可以防止回溯。他们常常用于防止正则表达式失败,因此可以使用正则表达式起来更加有效。
Matcher m = Pattern.compile("\\d+\\d") // \\d+都匹配到了3 6 0 3,遇到空格就无法匹配了,可是后面的\\d就无法匹配了,他就回溯,最终让后一个\\d匹配3 6 0 3
.matcher("123 456 78910 111213");
while(m.find())
System.out.println(m.group());
System.out.println("----------------------------------------");
Matcher m2 = Pattern.compile("\\d++\\d") // 但是占有型则不,它不回溯,也就一个也匹配不成了。
.matcher("123 456 78910 111213");
while(m2.find())
System.out.println(m2.group());
}
/*Output:
123
456
78910
111213
----------------------------------------
*/