【发布时间】:2010-10-09 03:14:04
【问题描述】:
我有一个 Perl 正则表达式。但我不确定是什么“?”在这种情况下的意思。
m#(?:\w+)#
? 在这里是什么意思?
【问题讨论】:
-
从最明显的开始:perlre (perldoc.perl.org/perlre.html)。
-
@msw 其中之一是this page right here。
我有一个 Perl 正则表达式。但我不确定是什么“?”在这种情况下的意思。
m#(?:\w+)#
? 在这里是什么意思?
【问题讨论】:
在这种情况下,? 实际上是与: 一起使用的。放在一起,分组开头的?: 表示分组但不捕获括号内的文本/模式(如,它不会存储在任何反向引用中,如\1 或$1,所以你不会能够直接访问分组的文本)。
更具体地说,? 在正则表达式中具有三个不同的含义:
? 量词表示表达式的“零次或一次重复”。我见过的典型示例之一是s?he,它将匹配she 和he,因为? 使s 成为“可选”
当量词(+、*、? 或一般的{n,m})后跟? 时,匹配是非贪婪的(即它将匹配最短的从允许匹配继续的位置开始的字符串)
括号组开头的? 表示您要执行特殊操作。在本例中,: 表示分组但不捕获。可用操作的确切列表因一个正则表达式引擎而异,但以下是其中一些的列表(不一定包罗万象):
A. Non-capturing group: (?:text)
B. Lookaround:(?=a) 用于前瞻,?! 用于负前瞻,或 ?<= 和 ?<! 用于后瞻(分别为正和负)。
C.Conditional Matches:(?(condition)then|else).
D. Atomic Grouping: a(?>bc|b)c(匹配 abcc 但不 abc;见链接)
E. Inline enabling/disabling of regex matching modifiers:?i 启用模式,?-i 禁用。您还可以通过简单地连接它们来一次启用/禁用多个修饰符,例如?im(i 不区分大小写,m 是多行)。
F.Named capture groups:(?P<name>pattern),稍后可以使用(?P=name) 引用。 .NET 正则表达式引擎改为使用语法 (?<name>pattern)。
G.Comments:(?#Comment text)。我个人认为这只会增加混乱,但我想它可以起到一些作用...free-spacing mode 可能是更好的选择((?x) 修饰符)。
所以本质上,? 的目的只是上下文相关的。如果您希望文字 ( 字符出现零次或多次重复,则必须使用 \(? 来转义括号。
【讨论】:
(?>...),这是支持它的风格的atomic group,以及(?i) 和(?-i),用于内联启用/禁用modifiers。
(?im) 启用了两种模式(不区分大小写和多行);)
(?:...)分组子表达式而不捕获(集群)
你can also useYAPE::Regex::Explain:
C:\\Temp> perl -MYAPE::Regex::Explain -e \
“打印 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 正则表达式。
【讨论】:
查看随每个 Perl 版本安装的regex tutorial(特别是this section)。
【讨论】: