-编辑- 注意.{2,}?
末尾的?
我发现你可以这样写:
.{2,}?
这不是和下面完全一样吗?
.{2}
-编辑- 注意.{2,}?
末尾的?
我发现你可以这样写:
.{2,}?
这不是和下面完全一样吗?
.{2}
{2,}
表示两次或更多,而 {2}
则表示恰好两次。量词默认是贪婪的,因此如果给定字符串 foo
并使用 .{2,}
,则会得到 foo
,但如果使用 .{2,}?
,则会得到 fo
,因为您使它变成了懒惰模式。然而,后者允许在必要时匹配超过两次,但 .{2}
总是表示恰好两个字符。
因此,如果您有字符串 test123
和模式 .{2,}?\d
,则会得到 test1
,因为它必须匹配最多四个字符,以便 \d
也能匹配。
12
123
1234
^.{2}$
只匹配长度恰好为 2 的字符串(如在 rubular.com 上看到的那样)。.{2,}?
会尝试先仅匹配两个字符。但为了使整体模式匹配成功,它可能需要更多字符。而.{2}
则不能匹配其他长度的字符串,只能匹配恰好长度为 2 的字符串。
在孤立状态下,它们可能表现相同,但在较大的表达式中不同,因为惰性版本允许匹配超过两个符号。
abx abcx
^.{2,}?x$ match match
^.{2}x$ match no match
.{2,}?
等同于.{2}
,但它不应该发生。其他人已经指出,正则表达式末尾的勉强量词总是匹配最少数量的字符,因为后面没有任何东西强制它消耗更多字符。
它们不应该在原子组内部子表达式的末尾使用。例如,假设您尝试使用以下内容匹配foo bar
:
f(?>.+?) bar
.+?
再次消耗另一个字符。但是它无法回溯到原子组,并且在组之前没有任何余地,因此匹配尝试失败。并不完全 使用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 个或更多
x.{2,}?x
匹配 "xasdfx"
在字符串 "xasdfxbx"
中,但是 x.{2}x
完全不匹配。
如果没有结尾的 ?
,第一个将匹配整个字符串。