1 贪婪:一下子打算匹配整个字符串,如果发现不匹配,就去掉最后一个字符,进行匹配,以此类推。一旦匹配成功之后,并不是马上返回,而是跳跃到下一个字符的起点,再次开始贪婪的匹配,举个例子:
public static void main(String []args) {
String str="1abbbaabbbaaabbb1234abbbc";
Pattern p2 = Pattern.compile("[^1]*bbb");
Matcher m2 =p2.matcher(str);
while(m2.find()){
System.out.println(m2.group());
}
}
他的执行过程应该是这样:
先找到满足条件的第一个字符,所以1会被过滤掉,然后进行全局匹配
abbbaabbbaaabbb1234abbb 不匹配
abbbaabbbaaabbb1234abb 不匹配
![](https://i-blog.csdnimg.cn/blog_migrate/9b8a8a44dd1c74ae49c20a7cd451974e.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/9b8a8a44dd1c74ae49c20a7cd451974e.gif)
abbbaabbbaaabbb 匹配
234abbb 匹配
一般量词都是贪心的,会尽量多的匹配
从第一个字符开始进行匹配,如果不匹配,那么就在读入一个字符,进行整体匹配,以此类推
还是看上面的例子,如果是贪婪的,那么正则是这样 [^1]*?bbb,执行过程如下:
先找到满足条件的第一个字符,所以1还是被过滤,从a开始,匹配过程如下
ab 不匹配
abb 不匹配
abbb 匹配
继续从下一个位置开始读入第一个匹配字符
aa 不匹配
![](https://i-blog.csdnimg.cn/blog_migrate/9b8a8a44dd1c74ae49c20a7cd451974e.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/9b8a8a44dd1c74ae49c20a7cd451974e.gif)
aabbb匹配
一直进行到最后,所以得到的结果为abbb,aabbb,aaabbb,234abbb
可以在任何量词后面加上一个?,使之变成懒惰的,如:
3 支配(也称占有量词)
支配就是对整个字符串进行一次匹配,匹配之后返回
举个例子,字符串为bbb,正则表达式为[b]*+,这是一个贪婪的匹配,直接返回bbb
但是这里有个要注意的地方:如果正则为 [b]*+b,返回结果是false,是空
所以虽然[b]*+匹配了,但是当再多了一个b的时候,有不满足要求了,因为他们是全局匹配的
另外一篇文章
-- Start
我们在 量词 一节中介绍了什么量词以及贪婪与非贪婪量词之间的区别。事实上,通常正则表达式支持以下三种量词。
贪婪量词 非贪婪量词 占有量词 匹配 X? X?? X?+ 匹配X 0次或1次 X* X*? X*+ 匹配X 0次或无数次 X+ X+? X++ 匹配X 1次或无数次 X{n} X{n}? X{n}+ 匹配X n次 X{n,} X{n,}? X{n,}+ 匹配X 至少n次 X{n,m} X{n,m}? X{n,m}+ 匹配X 至少n次至多m次
那它们之间有什么区别呢? 下面我们通过一个简单的例子来考察贪婪与非贪婪之间的区别。
- #!/usr/bin/perl
- my $testText = "abbbb"; # 测试文本
- # 测试贪婪量词
- if($testText =~ m/(ab*)/) {
- print "ab* 匹配了 $1\n";
- }
- # 测试非贪婪量词
- if($testText =~ m/(ab*?)/) {
- print "ab*? 匹配了 $1\n";
- }
结果如下:
- ab* 匹配了 abbbb
- ab*? 匹配了 a
看到它们之间的区别了吗?现在你应该知道了贪婪与非贪婪的真正含义了吧。
下面我们通过一个简单的例子来考察一下什么是占有量词。
- #!/usr/bin/perl
- my $testText = "<abbbb>"; # 测试文本
- # 测试贪婪量词
- if($testText =~ m/(<.*>)/) {
- print "<.*> 匹配了 $1\n";
- }
- # 测试非贪婪量词
- if($testText =~ m/(<.*?>)/) {
- print "<.*?> 匹配了 $1\n";
- }
- # 测试占有量词
- if($testText =~ m/(<.*+>)/) {
- print "<.*+> 匹配了 $1\n";
- } else {
- print "<.*+> 无法匹配 <abbbb>\n";
- }
结果如下:
- <.*> 匹配了 <abbbb>
- <.*?> 匹配了 <abbbb>
- <.*+> 无法匹配 <abbbb>
要想理解什么是占有量词,我们必须深入正则表达式的匹配原理,我们先来了解一下 <.*> 是如何匹配 <abbbb>的。1. 首先 < 匹配字符串中的 <
2. 接着 . *会匹配字符剩余的所有字符,也就是 abbbb>
3. 接着是 >,但是此时,字符串中的所有字符已经被.* 匹配了,为了使整个表达式匹配成功,.* 必须吐出一个字符,吐出之后,表达式会判断 > 能否匹配那个吐出的字符,如果不能,它会再吐出一个字符进行判断,我们把这一过程称为回溯。.* 和 .*+ 的唯一区别是,.* 会吐出字符而 .*+ 在任何时候都不会吐出字符,一旦吃的嘴里,想让它往出吐,门儿都没有,这就是占有的真正含义。
csdn下载地址:http://download.csdn.net/detail/lss1007472173/7859045
转自:正则表达式精萃
百度网盘下载地址: http://pan.baidu.com/s/1pJG3jDp