来自Patternjavadocs:
Greedy quantifiers:
X? X, once or not at all
X* X, zero or more times
X+ X, one or more times
X{n} X, exactly n times
X{n,} X, at least n times
X{n,m} X, at least n but not more than m times
Reluctant quantifiers:
X?? X, once or not at all
X*? X, zero or more times
X+? X, one or more times
X{n}? X, exactly n times
X{n,}? X, at least n times
X{n,m}? X, at least n but not more than m times
他们所做的事情的描述是一样的...那么,有什么区别?
我真的很感激一些例子.
我用Java编写代码,但我听说这个概念对于大多数现代正则表达式实现都是一样的.
Pat*_*and 38
一个贪婪的运算符总是试图"抓住"尽可能多的输入,而一个不情愿的量词将尽可能少地匹配输入并仍然创建一个匹配.
例:
"The red fox jumped over the red fence"
/(.*)red/ => \1 = "The red fox jumped over the "
/(.*?)red/ => \1 = "The "
"aaa"
/a?a*/ => \1 = "a", \2 = "aa"
/a??a*/ => \1 = "", \2 = "aaa"
"Mr. Doe, John"
/^(?:Mrs?.)?.*\b(.*)$/ => \1 = "John"
/^(?:Mrs?.)?.*?\b(.*)$/ => \1 = "Doe, John"
Run Code Online (Sandbox Code Playgroud)
akf*_*akf 10
在此链接中,教程作者承认您的问题的精神:
乍一看,似乎量词X?,X ?? 和X?+完全相同,因为它们都承诺匹配"X,一次或根本不匹配".有一些细微的实现差异,将在本节末尾附近解释.
他们继续汇总实例并提供解释:
贪心量词被认为是"贪婪的",因为它们在尝试第一次匹配之前强制匹配器读入或吃掉整个输入字符串.如果第一次匹配尝试(整个输入字符串)失败,匹配器将输入字符串后退一个字符并再次尝试,重复该过程直到找到匹配项或者没有剩余字符可以退出.根据表达式中使用的量词,它将尝试匹配的最后一件事是1或0个字符.
然而,不情愿的量词采用相反的方法:它们从输入字符串的开头开始,然后不情愿地一次吃一个字符寻找匹配.他们尝试的最后一件事是整个输入字符串.
对于额外的功劳,占有性的解释:
最后,占有量词总是吃整个输入字符串,尝试一次(并且只有一次)匹配.与贪婪的量词不同,占有量词永远不会退缩,即使这样做也会使整体匹配成功.
| 归档时间: |
|
| 查看次数: |
10936 次 |
| 最近记录: |