在这个Perl正则表达式中,`?`代表什么意思?

6

我有一个Perl正则表达式。但是我不确定在这个上下文中“?”的含义。

m#(?:\w+)#

这里的?是什么意思?


5
从最明显的开始:perlre(http://perldoc.perl.org/perlre.html)。 - musiKk
@msw,其中之一是这个页面 - user1804599
可能是 参考 - 这个正则表达式是什么意思? 的重复。 - tripleee
5个回答

27
在这种情况下,? 实际上是与 : 结合使用的。放在一起,表示在分组的开头使用 ?: 表示对文本/模式进行分组但不捕获(如,它不会在任何后向引用中存储,例如 \1$1,因此您无法直接访问分组的文本)。
更具体地说,在正则表达式中,? 有三个不同的含义:
  1. ? 量词表示 "零次或一次" 的表达式重复。我见过的经典例子之一是 s?he,它将匹配 shehe,因为 ? 使 s 是 "可选的"

  2. 当量词 (+, *, ?, 或通用的 {n,m}) 后面跟一个 ? 时,则匹配是非贪婪的 (即,它将匹配从该位置开始允许匹配进行的最短字符串)

  3. 括号分组的开头处的 ? 表示您想执行特殊操作。在本例中,: 表示分组但不捕获。可用的确切操作列表可能因一个正则表达式引擎而异,但以下是一些操作(不一定全包括)的列表:

    A. 非捕获组: (?:text)
    B. 环视: (?=a) 表示正向预查,?! 表示负向预查,或者使用 ?<=?<! 来表示回顾后发现 (分别是正和负)。
    C. 条件匹配(?(condition)then|else)
    D. 原子组a(?>bc|b)c(匹配abcc而不匹配abc;详见链接)。
    E. 内嵌启用/禁用正则表达式匹配修饰符:使用?i以启用一种模式,使用?-i以禁用。您还可以通过简单地连接它们来启用/禁用多个修饰符,例如?imi不区分大小写,m是多行)。
    F. 命名捕获组(?P<name>pattern),稍后可以使用(?P=name)引用。.NET正则表达式引擎使用语法(?<name>pattern)
    G. 注释(?#Comment text)。我个人认为这只会增加混乱,但我想它可能有些用处... 自由空间模式可能是更好的选择(使用(?x)修饰符)。

因此,?的目的仅仅是上下文相关。如果您想要零个或多个重复的字面意义的(字符,您必须使用\(?转义括号。


对于第三点,还有(?>...),它是在支持的语言中的一个原子组,以及(?i)(?-i)用于内联启用/禁用修饰符 - Daniel Vandersluis
@Daniel:谢谢。我想我会整理一下第三个,并添加一个带有一些链接的列表,这样其他人也可以继续添加。 - eldarerathis
为了清晰起见,(?im) 启用了两种模式(大小写不敏感和多行);) - Daniel Vandersluis
@Daniel Vandersluis:好的,我已经编辑了回答以使那更加清晰。我可以理解在我的原始措辞中那不是很明显。我认为现在好多了 :) - eldarerathis

7

$ perldoc perlreref

(?:...) 不捕获分组,只用于分组(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次或多次(尽可能多地匹配)) ---------------------------------------------------------------------- ) 结束组合 ---------------------------------------------------------------------- ) 结束组合 ----------------------------------------------------------------------

2

2
简而言之,序列(?开始一个正则表达式的特殊功能。紧随其后的内容指定了特殊功能,本例中为非捕获分组。我们在《Intermediate Perl》和《Effective Perl Programming》中都有涉及到。 perlre文件记录了Perl正则表达式。

1

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