6

我一直在阅读本网站和网络上关于非捕获组的一些文章(例如http://www.regular-expressions.info/brackets.htmlhttp://www.asiteaboutnothing.net/regexp/ regex-disambiguation.html , "?:^" 正则表达式是什么意思? ,什么是非捕获组?问号后跟冒号 (?:) 是什么意思?

我很清楚 (?:foo) 的含义。我不清楚的是(?= foo)。(?=foo) 是否也始终是非捕获组,还是取决于?

4

3 回答 3

10

不,(?=foo)不会捕获"foo"。任何环视断言(正面和正面的前后观察)都不会捕获,而只会检查文本的存在(或不存在)。

例如,正则表达式:

(X(?=\d+))

"X"仅当其后有一位或多位数字时才匹配。但是,这些数字不是匹配组 1 的一部分。

可以前瞻中定义捕获以捕获它。例如,正则表达式:

(X(?=(\d+)))

"X"仅当其后有一位或多位数字时才匹配。这些数字被捕获在匹配组 2 中。

一个 PHP 演示:

<?php
$s = 'X123';
preg_match_all('/(X(?=(\d+)))/', $s, $matches);
print_r($matches);
?>

将打印:

大批
(
    [0] => 数组
        (
            [0] => X
        )

    [1] => 数组
        (
            [0] => X
        )

    [2] => 数组
        (
            [0] => 123
        )

)
于 2012-07-11T15:06:55.427 回答
6

环视总是非捕获和零宽度。

于 2012-07-11T15:00:57.297 回答
2

开始的每个组?都不会被捕获,尽管只能(?:foo)作为常规组工作。

于 2012-07-11T15:01:19.313 回答