【问题标题】:What does `?` mean in this Perl regex?`?` 在这个 Perl 正则表达式中是什么意思?
【发布时间】:2010-10-09 03:14:04
【问题描述】:

我有一个 Perl 正则表达式。但我不确定是什么“?”在这种情况下的意思。

m#(?:\w+)#

? 在这里是什么意思?

【问题讨论】:

标签: regex perl


【解决方案1】:

在这种情况下,? 实际上是与: 一起使用的。放在一起,分组开头的?: 表示分组但不捕获括号内的文本/模式(如,它不会存储在任何反向引用中,如\1$1,所以你不会能够直接访问分组的文本)。

更具体地说,? 在正则表达式中具有三个不同的含义:

  1. ? 量词表示表达式的“零次或一次重复”。我见过的典型示例之一是s?he,它将匹配shehe,因为? 使s 成为“可选”

  2. 当量词(+*? 或一般的{n,m})后跟? 时,匹配是非贪婪的(即它将匹配最短的从允许匹配继续的位置开始的字符串)

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

    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 禁用。您还可以通过简单地连接它们来一次启用/禁用多个修饰符,例如?imi 不区分大小写,m 是多行)。
    F.Named capture groups(?P<name>pattern),稍后可以使用(?P=name) 引用。 .NET 正则表达式引擎改为使用语法 (?<name>pattern)
    G.Comments:(?#Comment text)。我个人认为这只会增加混乱,但我想它可以起到一些作用...free-spacing mode 可能是更好的选择((?x) 修饰符)。

所以本质上,? 的目的只是上下文相关的。如果您希望文字 ( 字符出现零次或多次重复,则必须使用 \(? 来转义括号。

【讨论】:

  • 对于第 3 点,还有(?>...),这是支持它的风格的atomic group,以及(?i)(?-i),用于内联启用/禁用modifiers
  • @Daniel:谢谢。我想我要清理 #3 并添加一个包含一些链接的列表,以便其他人也可以继续添加。
  • 为了清楚起见,(?im) 启用了两种模式(不区分大小写和多行);)
  • @Daniel Vandersluis:是的,经过编辑以使答案更清晰。我可以看到这在我原来的措辞中并不明显。我认为这更好:)
【解决方案2】:

$ perldoc perlreref:

(?:...) 分组子表达式而不捕获(集群)

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 或
                             更多次(匹配最多的数量
                             可能的))
-------------------------------------------------- --------------------
  ) 分组结束
-------------------------------------------------- --------------------
) 分组结束
-------------------------------------------------- --------------------

【讨论】:

    【解决方案3】:

    那些是非捕获括号。它们用于分组(就像普通括号一样),但不会将组添加到捕获数组中(即它不会被 \n 引用)。

    请看这里:http://www.regular-expressions.info/refadv.html

    【讨论】:

      【解决方案4】:

      简而言之,序列(? 启动了正则表达式的特殊功能。 (? 后面的内容指定特殊功能,在本例中为非捕获分组。我们在 Intermediate PerlEffective Perl Programming 中都介绍了这一点。 perlre 记录 Perl 正则表达式。

      【讨论】:

        【解决方案5】:

        查看随每个 Perl 版本安装的regex tutorial(特别是this section)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-04-15
          • 2012-05-07
          • 1970-01-01
          • 2013-02-18
          • 2017-05-23
          • 2016-02-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多