我有一个Perl正则表达式。但是我不确定在这个上下文中“?”的含义。
m#(?:\w+)#
这里的?
是什么意思?
?
实际上是与 :
结合使用的。放在一起,表示在分组的开头使用 ?:
表示对文本/模式进行分组但不捕获(如,它不会在任何后向引用中存储,例如 \1
或 $1
,因此您无法直接访问分组的文本)。?
有三个不同的含义:
?
量词表示 "零次或一次" 的表达式重复。我见过的经典例子之一是 s?he
,它将匹配 she
和 he
,因为 ?
使 s
是 "可选的"
当量词 (+
, *
, ?
, 或通用的 {n,m}
) 后面跟一个 ?
时,则匹配是非贪婪的 (即,它将匹配从该位置开始允许匹配进行的最短字符串)
括号分组的开头处的 ?
表示您想执行特殊操作。在本例中,:
表示分组但不捕获。可用的确切操作列表可能因一个正则表达式引擎而异,但以下是一些操作(不一定全包括)的列表:
A. 非捕获组: (?:text)
B. 环视: (?=a)
表示正向预查,?!
表示负向预查,或者使用 ?<=
和 ?<!
来表示回顾后发现 (分别是正和负)。
C. 条件匹配:(?(condition)then|else)
。
D. 原子组:a(?>bc|b)c
(匹配abcc
而不匹配abc
;详见链接)。
E. 内嵌启用/禁用正则表达式匹配修饰符:使用?i
以启用一种模式,使用?-i
以禁用。您还可以通过简单地连接它们来启用/禁用多个修饰符,例如?im
(i
不区分大小写,m
是多行)。
F. 命名捕获组:(?P<name>pattern)
,稍后可以使用(?P=name)
引用。.NET正则表达式引擎使用语法(?<name>pattern)
。
G. 注释:(?#Comment text)
。我个人认为这只会增加混乱,但我想它可能有些用处... 自由空间模式可能是更好的选择(使用(?x)
修饰符)。
因此,?
的目的仅仅是上下文相关。如果您想要零个或多个重复的字面意义的(
字符,您必须使用\(?
转义括号。
(?:...)
不捕获分组,只用于分组(cluster)
您也可以使用YAPE::Regex::Explain:(参考链接)
C:\\Temp> perl -MYAPE::Regex::Explain -e \ "print YAPE::Regex::Explain->new(qr#(?:\w+)#)->explain"
正则表达式:
(?-imsx:(?:\w+))
匹配如下:
节点 说明 ---------------------------------------------------------------------- (?-imsx: 组合但不捕获(区分大小写) (^和$通常匹配)(.不匹配\n)(空格和# 通常匹配): ---------------------------------------------------------------------- (?: 组合但不捕获: ---------------------------------------------------------------------- \w+ 单词字符(a-z、A-Z、0-9、_)(1次或多次(尽可能多地匹配)) ---------------------------------------------------------------------- ) 结束组合 ---------------------------------------------------------------------- ) 结束组合 ----------------------------------------------------------------------
这些是非捕获括号。它们用于分组(就像普通括号一样),但该组不会添加到捕获数组中(即不能使用 \n 引用它)。
(?
开始一个正则表达式的特殊功能。紧随其后的内容指定了特殊功能,本例中为非捕获分组。我们在《Intermediate Perl》和《Effective Perl Programming》中都有涉及到。 perlre文件记录了Perl正则表达式。