正则表达式的贪婪匹配和非贪婪匹配
2015-10-26 16:37
190 查看
本文转自 http://blog.csdn.net/hellobobantang/article/details/7048240
http://itlab.idcquan.com/Java/base/773980.html
By default, pattern matching is greedy, which means that the matcher returns the longest match possible. For example, applying the pattern
than the shorter
find the shortest match possible.
// Greedy quantifiers
String match = find("A.*c","AbcAbc"); // AbcAbc
// Nongreedy quantifiers
match = find("A.*?c","AbcAbc"); // Abc
关于?=
http://topic.csdn.net/u/20100902/16/9a8f2249-86f2-4f80-b5f5-dbf8769ba674.html
贪婪量词:
惰性量词:
支配量词:
贪婪量词 惰性量词 支配量词 描述
-------------------------------------------------------------------------------------
? ?? ?+ 可以出现0次或1次,但至多出现1次
* *? *+ 可以出现任意次,也可以不出现
+ +? ++ 出现1次或多次,但至少出现1次
{n} {n}? {n}+ 一定出现n次
{n,m} {n,m}? {n,m}+ 至少出现n次,但至多不能超过m次
{n,} {n,}? {n,}+ 可以出现任意次,但至少出现n次
例如:我们要从字符串abbbaabbbaaabbb1234中获得abbb,aabbb,aaabbb的匹配
1、贪婪量词
贪婪量词的工作过程可以这样表示:
a)abbbaabbbaaabbb1234
b)abbbaabbbaaabbb123
c)abbbaabbbaaabbb12
d)abbbaabbbaaabbb1
e)abbbaabbbaaabbb //true
可以看到,贪婪量词在取得一次匹配后就会停止工作,虽然我们加了'g'(全局匹配)
2、惰性量词
惰性量词的工作过程可以这样表示:
a)a
b)ab
c)abb
d)abbb //保存结果,并从下一个位置重新开始
e)a
f)aa
g)aab
h)aabb
j)aabbb //保存结果,并从下一个位置重新开始
e)a
e)aa
e)aaa
e)aaab
e)aaabb
e)aaabbb //保存结果,并从下一个位置重新开始
由于JS是不支持支配量词的,所以支配量词我们只能用JAVA来演示:
因为支配量词采用一刀切的匹配方式,如:
a)abbbaabbbaaabbb1234 //false
http://itlab.idcquan.com/Java/base/773980.html
By default, pattern matching is greedy, which means that the matcher returns the longest match possible. For example, applying the pattern
A.*cto
AbcAbcAmatches
AbcAbcrather
than the shorter
Abc. To do nongreedy matching, a question mark must be added to the quantifier. For example, the pattern
A.*?cwill
find the shortest match possible.
// Greedy quantifiers
String match = find("A.*c","AbcAbc"); // AbcAbc
// Nongreedy quantifiers
match = find("A.*?c","AbcAbc"); // Abc
关于?=
http://topic.csdn.net/u/20100902/16/9a8f2249-86f2-4f80-b5f5-dbf8769ba674.html
贪婪量词:
先看整个字符串是不是一个匹配。如果没有发现匹配,它去掉最后字符串中的最后一个字符,并再次尝试。如果还是没有发现匹配,那么 再次去掉最后一个字符串,这个过程会一直重复直到发现一个匹配或者字符串不剩任何字符。简单量词都是贪婪量词。 |
先看字符串中的第一个字母是不是一个匹配,如果单独着一个字符还不够,就读入下一个字符,组成两个字符的字符串。如果还没有发现匹配,惰性量词继续从字符串中添加字符直到发现一个匹配或者整个字符串都检查过也没有匹配。惰性量词和贪婪量词的工作方式恰好相反。 |
只尝试匹配整个字符串。如果整个字符串不能产生匹配,不做进一步尝试。 |
-------------------------------------------------------------------------------------
? ?? ?+ 可以出现0次或1次,但至多出现1次
* *? *+ 可以出现任意次,也可以不出现
+ +? ++ 出现1次或多次,但至少出现1次
{n} {n}? {n}+ 一定出现n次
{n,m} {n,m}? {n,m}+ 至少出现n次,但至多不能超过m次
{n,} {n,}? {n,}+ 可以出现任意次,但至少出现n次
例如:我们要从字符串abbbaabbbaaabbb1234中获得abbb,aabbb,aaabbb的匹配
1、贪婪量词
1 var regexp = /.*bbb/g; 2 var a = str.match(regexp); 3 alert(a.length); //output:1 4 alert(a[0]); //output:abbbaabbbaaabbb |
a)abbbaabbbaaabbb1234
b)abbbaabbbaaabbb123
c)abbbaabbbaaabbb12
d)abbbaabbbaaabbb1
e)abbbaabbbaaabbb //true
可以看到,贪婪量词在取得一次匹配后就会停止工作,虽然我们加了'g'(全局匹配)
2、惰性量词
1 var regexp = /.*?bbb/g; 2 var a = str.match(regexp); 3 alert(a.length); //output:3 4 alert(a[0]); //output:abbb 5 alert(a[1]); //output:aabbb 6 alert(a[2]); //output:aaabbb |
a)a
b)ab
c)abb
d)abbb //保存结果,并从下一个位置重新开始
e)a
f)aa
g)aab
h)aabb
j)aabbb //保存结果,并从下一个位置重新开始
e)a
e)aa
e)aaa
e)aaab
e)aaabb
e)aaabbb //保存结果,并从下一个位置重新开始
由于JS是不支持支配量词的,所以支配量词我们只能用JAVA来演示:
1 String string = "abbbaabbbaaabbb1234"; 2 Pattern p = Pattern.compile(".*+bbb"); 3 Matcher m = p.matcher(string); 4 System.out.println(m.find()); //output:false 5 |
a)abbbaabbbaaabbb1234 //false
相关文章推荐
- mysql主从复制跳过错误
- test credit card account
- Linux 定时任务经典案例
- C++设计模式之桥接模式(改编自C++设计模式)
- Log4j详细使用教程
- BI之路学习笔记3--olap cube理解实例
- 第八周项目3——顺序串算法(1)
- shell
- iOS Framework
- 数据结构实践——顺序串算法
- 反复修改才能创造出优秀的代码
- DDL,DQL,DCL,DML
- 从github直接下载文件方法
- 常用服务器的端口号学习
- 01-电脑小技巧
- 基于jQuery实现搜索关键字自动匹配功能
- NAND FLASH中plane的概念
- SQL Server的CONVERT() 函数介绍
- android studio 中 .9.png的制作
- 如何控制多线程之间的优先级顺序