`regex {n,}?`==`正则表达式{n}`?

时间:2010-07-06 08:01:11

标签: regex

-edit-请注意?

末尾的.{2,}?

我发现你可以写

.{2,}?

不完全和下面一样吗?

.{2}

7 个答案:

答案 0 :(得分:18)

没有。 {2,}表示两次或更多次,{2}表示完全两次。默认情况下,量词是贪婪的,所以给定字符串foo如果你使用foo,你将获得.{2,},但如果你使用fo,则.{2,}?因为你做了.{2}懒。但是,如果需要,后者允许匹配两次以上,但test123总是意味着完全两个字符。

因此,如果你有字符串.{2,}?\d和模式test1,你会得到\d因为它必须匹配最多四个字符,所以{{1}}也可以匹配

答案 1 :(得分:6)

不,他们是不同的。 ^.{2,}?$匹配长度至少 2(as seen on rubular.com)的字符串:

12
123
1234

相比之下,^.{2}$仅匹配长度正好 2(as seen on rubular.com)的字符串。

不情愿,.{2,}?首先尝试只匹配两个字符是正确的。但是要匹配整体模式,可能需要更多。 .{2}不是这种情况,只能匹配2个字符。

参考

相关问题

答案 2 :(得分:3)

在隔离中,它们可能表现相同但不在较大的表达式中,因为允许惰性版本匹配两个以上的符号。

             abx        abcx

^.{2,}?x$    match      match
^.{2}x$      match      no match

答案 3 :(得分:2)

使这个问题特别有趣的是,当.{2,}?等同于.{2}次,但它永远不会发生。其他人已经指出了正则表达式最后的一个不情愿的量词总是如何匹配最小字符数,因为在它之后没有任何东西强迫它消耗更多。

它们不应被使用的另一个地方是atomic group内的子表达式的末尾。例如,假设您尝试将foo bar

匹配
f(?>.+?) bar

子表达式最初消耗第一个“o”并移交到下一个部分,后者尝试匹配空格失败。没有原子组,它会回溯并让.+?消耗另一个角色。但是它不能回溯到原子组,并且在组之前没有摆动,所以匹配尝试失败。

正则表达式结束时或原子子表达式结束时不情愿的量词是明确的代码气味。

答案 4 :(得分:0)

不完全是 使用PHP进行正则表达式匹配并显示捕获

$string = 'aaabbaabbbaaa';

$search = preg_match_all('/b{2}a/',$string,$matches,PREG_SET_ORDER );

echo '<pre>';
var_dump($matches);
echo '</pre>';

$search = preg_match_all('/b{2,}?a/',$string,$matches,PREG_SET_ORDER );

echo '<pre>';
var_dump($matches);
echo '</pre>';

第一个结果给出:

array(2) {
  [0]=>
  array(1) {
    [0]=>
    string(3) "bba"
  }
  [1]=>
  array(1) {
    [0]=>
    string(3) "bba"
  }
}

第二个给出:

array(2) {
  [0]=>
  array(1) {
    [0]=>
    string(3) "bba"
  }
  [1]=>
  array(1) {
    [0]=>
    string(4) "bbba"
  }
}

使用b {2},捕获只返回2 b,b {2,}返回2或更多

答案 5 :(得分:0)

x.{2,}?x"xasdfx"中的"xasdfxbx"匹配,但x.{2}x根本不匹配。

如果没有尾随?,则第一个将匹配整个字符串。

答案 6 :(得分:0)

不,他们是不同的:

.{2,}?:任意角色,至少重复2次,尽可能少

.{2}:任何角色,正好是2次重复