`regex{n,}?` == `regex{n}`?

3

-编辑- 注意.{2,}?末尾的?

我发现你可以这样写:

.{2,}?

这不是和下面完全一样吗?

.{2}

3
第一个表达式表示“2个或更多”,而最后一个表示“恰好2个”。 - John P
4
@John P - 为什么不将你的评论写成一个答案呢? - Oded
伙计们,加标签和将所有大写字母加粗是怎么回事啊?就让问题保持原样吧。 - user34537
7个回答

18

{2,} 表示两次或更多,而 {2} 则表示恰好两次。量词默认是贪婪的,因此如果给定字符串 foo 并使用 .{2,},则会得到 foo,但如果使用 .{2,}?,则会得到 fo,因为您使它变成了懒惰模式。然而,后者允许在必要时匹配超过两次,但 .{2} 总是表示恰好两个字符。

因此,如果您有字符串 test123 和模式 .{2,}?\d,则会得到 test1,因为它必须匹配最多四个字符,以便 \d 也能匹配。


你在{2,}的结尾忘记了问号? - user34537
@acidzombie24 是的,已经修复了。 - Daniel Egeberg

6
不,它们是不同的。"^.{2,}?$"匹配长度至少为2的字符串(如在rubular.com中所见):
12
123
1234

相比之下,^.{2}$ 只匹配长度恰好为 2 的字符串(如在 rubular.com 上看到的那样)。
没错,.{2,}? 会尝试先仅匹配两个字符。但为了使整体模式匹配成功,它可能需要更多字符。而.{2} 则不能匹配其他长度的字符串,只能匹配恰好长度为 2 的字符串。

参考资料

相关问题


3

在孤立状态下,它们可能表现相同,但在较大的表达式中不同,因为惰性版本允许匹配超过两个符号。

             abx        abcx

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

我差点选择了你,但我喜欢rubular.com,并希望更多人注意它。 - user34537

2
这个问题特别有趣的原因是,有时.{2,}?等同于.{2},但它不应该发生。其他人已经指出,正则表达式末尾的勉强量词总是匹配最少数量的字符,因为后面没有任何东西强制它消耗更多字符。

它们不应该在原子组内部子表达式的末尾使用。例如,假设您尝试使用以下内容匹配foo bar

f(?>.+?) bar

子表达式最初消耗第一个'o'并传递给下一个部分,它试图匹配一个空格但不成功。没有原子组,它会回溯并让.+?再次消耗另一个字符。但是它无法回溯到原子组,并且在组之前没有任何余地,因此匹配尝试失败。
正则表达式末尾或原子子表达式末尾的勉强量词是明显的代码异味。

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 个或更多


你还忘记在 {2,} 的结尾加上 ?。 - user34537
添加了问号,但不影响捕获的结果。 - Mark Baker

0

x.{2,}?x 匹配 "xasdfx" 在字符串 "xasdfxbx" 中,但是 x.{2}x 完全不匹配。

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


0
不,它们是不同的: < p > < code > . {2,}? :任何字符,至少2次重复,尽可能少

< p > < code > . {2} :任何字符,恰好2次重复


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接