在这个Perl正则表达式中,“?”是什么意思?

时间:2010-10-08 13:05:08

标签: regex perl

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

m#(?:\w+)#

?在这里意味着什么?

5 个答案:

答案 0 :(得分:25)

在这种情况下,?实际上与:一起使用。放在一起,?:在分组的开头意味着分组但不捕获括号内的文本/模式(如同,它不会存储在任何后向引用中,如\1或{{1} },所以你将无法直接访问分组文本。

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

  1. ?量词表示表达式的“零或一次重复”。我见过的一个规范示例是?,它会匹配s?heshe,因为he会使?“可选”

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

  3. 括号内组开头的?表示您要执行特殊操作。在这种情况下,?表示分组但不捕获。可用的操作列表从一个正则表达式引擎到另一个正则表达式引擎会有所不同,但这里有一些列表(不一定包括所有内容):

    一个。 Non-capturing group:
     B. Lookaround(?:text)用于预测,(?=a)用于负向前瞻,或?!?<=用于外观(分别为正面和负面)。 />  C. Conditional Matches?<!
     D. Atomic Grouping(?(condition)then|else)(匹配a(?>bc|b)c abcc;请参阅链接)
     E. Inline enabling/disabling of regex matching modifiersabc启用模式,?i禁用。您也可以通过简单连接来启用/禁用多个修饰符,例如?-i?im不区分大小写,i是多行)。
     F. Named capture groupsm,稍后可以使用(?P<name>pattern)引用。 .NET正则表达式引擎使用语法(?P=name)代替  G. Comments(?<name>pattern)。我个人认为这只会增加混乱,但我想这可能有用...... free-spacing mode可能是更好的选择((?#Comment text)修饰符)。

  4. 基本上,(?x)的目的只是语境。如果你想要一个文字?字符重复零次或多次,你必须使用(来逃避这些字符。

答案 1 :(得分:7)

$ perldoc perlreref

  

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

can also use YAPE::Regex::Explain

C:\\Temp> perl -MYAPE::Regex::Explain -e \ 
"print YAPE::Regex::Explain->new(qr#(?:\w+)#)->explain"

The regular expression:

(?-imsx:(?:\w+))

matches as follows:

NODE                     EXPLANATION
----------------------------------------------------------------------
(?-imsx:                 group, but do not capture (case-sensitive)
                         (with ^ and $ matching normally) (with . not
                         matching \n) (matching whitespace and #
                         normally):
----------------------------------------------------------------------
  (?:                      group, but do not capture:
----------------------------------------------------------------------
    \w+                      word characters (a-z, A-Z, 0-9, _) (1 or
                             more times (matching the most amount
                             possible))
----------------------------------------------------------------------
  )                        end of grouping
----------------------------------------------------------------------
)                        end of grouping
----------------------------------------------------------------------

答案 2 :(得分:2)

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

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

答案 3 :(得分:2)

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

答案 4 :(得分:1)

请参阅随每个Perl版本安装的regex tutorial(特别是this section)。