public static void main(String args[]) { String a = "aaaaabb"; Pattern p = Pattern.compile("a.*?"); Matcher m = p.matcher(a); while(m.find()) System.out.print(m.group());
}//结果:aaaaa public static void main(String args[]) { String a = "aaaaabb"; Pattern p = Pattern.compile("a.*"); Matcher m = p.matcher(a); while(m.find()) System.out.print(m.group());
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次
Reluctant 数量词
X?? X,一次或一次也没有
X*? X,零次或多次
X+? X,一次或多次
X{n}? X,恰好 n 次
X{n,}? X,至少 n 次
X{n,m}? X,至少 n 次,但是不超过 m 次
Possessive 数量词
X?+ X,一次或一次也没有
X*+ X,零次或多次
X++ X,一次或多次
X{n}+ X,恰好 n 次
X{n,}+ X,至少 n 次
X{n,m}+ X,至少 n 次,但是不超过 m 次
有区别,但我不懂,嘎嘎。
Greedy 数量词 和Possessive 数量词(+)都是先取最大范围的串
Reluctant 数量词(?)是先做最小范围的串匹配,一旦满足就不做了
现在的问题Greedy和Reluctant分别是什么意思?
.*X 如果用这个模式来匹配一个字符串,它会从左至右匹配任意字符,找到最远的那个X为止。即为贪婪算法(Greedy)
.*?X 相反,这个模式从左到右匹配,找到最近的X为止。对于字符串abcXdX来说,第一个模式中的.*对应的字符串就是abcXd,而第二个魔术师中的.*?对应的字符串是abc
你也可以看看这里的内容,对你有帮助
a=====b=====b===a.*b 将匹配满足条件最长的字符串 a=====b=====b* 因为它比较贪,因此被称为贪婪量词。贪婪量词的工作方式:
首先将:a=====b=====b=== 全部吃掉,从右边一个一个地吐出来1. a=====b=====b=== 不匹配,吐出一字符
2. a=====b=====b== 不匹配,再吐出一字符
3. a=====b=====b= 不匹配,再吐出一字符
4. a=====b=====b 匹配了,结束。如果再不匹配继续吐,直到没有字符了,匹配失败a.*? 将匹配满足条件最短的字符串 a=====b*? 比较懒,因此称为懒惰或者是勉强量词。勉强量词的工作方式:
从左边一个一个地吃掉字符
1. a 不能匹配表达式,继续吃
2. a= 不能匹配表达式,继续吃
3. a== 不能匹配表达式,继续吃
4. a=== 不能匹配表达式,继续吃
5. a==== 不能匹配表达式,继续吃
6. a===== 不能匹配表达式,继续吃
7. a=====b 呵呵,终于能匹配表达式了,匹配结束,匹配位置留于字符 b 后面,继续其他的匹配。如果不能匹配则一个一个地吃掉整个字符串直到吃完为止若还没有匹配则匹配失败。引自:http://topic.csdn.net/u/20080325/17/fb7a3e8d-029a-4d8e-89ae-77a9d28ec301.html我在 34 楼的回复。
Matcher mm = pp.matcher("adc889acv988a");能解释一下为什么是988吗
主要是(?<!\\d)不知道是怎么用的
.* 是贪婪的,以最大方式匹配,前面也说到了是吃掉所有的字符(因为是 .),再一个一个地
往外吐。这里涉及到两个贪婪和一个否定型的前视,很难用 15 楼的方式来说明。正因为匹配到 988 的原因在于前面的 .* 是贪婪的,以最大方式匹配了 adc889acv,如果改成 .*?
的话,这个就匹配 adc 了,因为是懒惰的。(?<!\\d)\\d+ 的意思表示匹配字符串中的数字,如果只写成 \\d+ 的话,只能匹配到一个数字,因为
前面的 .* 是贪婪的,只让出一个数让 \\d+ 匹配成功。但是采用 (?<!\\d)\\d+ 这种就不一样了,单单让出一个数是不能匹配这个表达式的,因为最后的 988
在最后一个 8 的前面还是数字,但是表达式要求 (?<!\\d) 了,即数字前面不允许出现数字,这时前面
的 .* 只能继续吐出字符,直到满足这个条件。
public static void main(String args[]) {
String a = "aaaaabb";
Pattern p = Pattern.compile("a.*?");
Matcher m = p.matcher(a);
while(m.find())
System.out.print(m.group());
}//结果:aaaaa
public static void main(String args[]) {
String a = "aaaaabb";
Pattern p = Pattern.compile("a.*");
Matcher m = p.matcher(a);
while(m.find())
System.out.print(m.group());
}//结果:结果:aaaaabb