不久之前,我在正则表达式中看到过(至少在PHP中)你可以通过前置来捕获捕获组?:
.
$str = 'big blue ball';
$regex = '/b(ig|all)/';
preg_match_all($regex, $str, $matches);
var_dump($matches);
Run Code Online (Sandbox Code Playgroud)
输出...
array(2) {
[0]=>
array(2) {
[0]=>
string(3) "big"
[1]=>
string(4) "ball"
}
[1]=>
array(2) {
[0]=>
string(2) "ig"
[1]=>
string(3) "all"
}
}
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我不关心括号中匹配的内容,所以我附加了?:
('/b(?:ig|all)/'
)并得到了输出
array(1) {
[0]=>
array(2) {
[0]=>
string(3) "big"
[1]=>
string(4) "ball"
}
}
Run Code Online (Sandbox Code Playgroud)
这非常有用 - 至少我是这么认为的.有时你只是不想让你的比赛混乱不必要的值.
我试图查找文档和正式名称(我称之为非捕获组,但我想我之前已经听过).
作为符号,谷歌似乎很难.
我还看了一些正则表达式参考指南,没有提及.
被?
括号括起来并出现在括号内的第一个字符中会让我相信它与前瞻或外观有关.
那么,这些的正确名称是什么,我在哪里可以了解更多?
irc*_*ell 30
它可以在官方文档的Subpatterns页面上找到.
普通括号实现两个功能的事实并不总是有用的.有时候需要分组子模式而没有捕获要求.如果开口括号后面跟着"?:",子模式不做任何捕获,以及计算任何后续捕获的子模式的数量时,不进行计数.例如,如果将字符串"白女王"抵靠图案匹配((?:红色|白色)(王|王后))的捕获的子串是"白女王"和"女王",和被编号1和2捕获的子串的最大数量为99,捕获和非捕获的所有子模式的最大数量为200.
还可以注意到,您可以使用它为子模式设置选项.例如,如果只希望子模式不区分大小写,则可以执行以下操作:
(?i:foo)bar
Run Code Online (Sandbox Code Playgroud)
将匹配:
但不是
哦,虽然官方文档实际上没有明确地命名语法,但它确实在稍后将其称为"非捕获子模式"(这完全有道理,并且无论如何我都会称之为,因为它不是真的一个"组",但一个子模式)...
(?:)
整体上代表一个非捕获组.
Regular-expressions.info提到了这种语法:
开始圆括号后的问号和冒号是特殊的语法,您可以使用它来告诉正则表达式引擎这对括号不应该创建反向引用.请注意,问号[...]是正则表达式运算符,它使前一个标记可选.在开始圆括号之后,此运算符不能出现,因为开括号本身不是有效的正则表达式标记.因此,问号作为使标记可选的操作符与作为改变一对圆括号的属性的字符的问号之间没有混淆.冒号表示我们想要做的改变是关闭捕获反向引用.