这个符号在正则表达式中意味着“?:”是什么意思?

时间:2013-03-12 21:10:11

标签: regex pattern-matching

我从RegexLib找到了以下正则表达式。

^(?:(?:(?:0?[13578]|1[02])(\/|-|\.)31)\1|(?:(?:0?[13-9]|1[0-2])(\/|-|\.)(?:29|30)\2))(?:
(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:0?2(\/|-|\.)29\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468]
[048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:(?:0?[1-9])|(?:1[0-2]))
(\/|-|\.)(?:0?[1-9]|1\d|2[0-8])\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$

来自http://regexlib.com/REDetails.aspx?regexp_id=113

我不明白“?:”的符号,在这个正则表达式中多次使用。似乎“:”不在chartsheet

我熟悉正则表达式。任何人都可以用正则表达式和输入显示一个例子吗?

3 个答案:

答案 0 :(得分:7)

(?:...)只是一个非捕获组,意味着该组匹配的字符串部分未存储,$1\1

捕获组由左括号编号,所以

示例文本“Foobar test”

  1. 以下是两个捕获组

    ^(\w+)\s*(\w+)
     1       2
    

    这将导致:

    $1 = "Foobar"
    
    $2 = "test"
    
  2. 这里只有一个捕获组:

    ^(?:\w+)\s*(\w+)
               1
    

    这将导致:

    $1 = "test" 
    

答案 1 :(得分:2)

(?:...)是一个非捕获组,也就是说,它控制运算符优先级,但不会创建匹配组。

答案 2 :(得分:2)

(?:)

代表非捕获组。请参阅perldoc perlre是IMHO使用REGEX的最高级语言:例如,表示 Perl兼容正则表达式,是{{ 1}},PHPpcregrep

perl doc的相关部分:

  

(?:图案)
  (?adluimsx-imsx:图案)
  (?^ aluimsx:pattern)

     

这是用于聚类,而不是捕获;它对"()"等子表达式进行分组,但不作为"()"进行反向引用。确实

使用查看此示例:

grep -P

如您所见,第一个匹配的捕获组($ echo 'azfoobar' | perl -lne 'print $1 if /^(?:az)(.*)/' foobar )不是$1,而是其余部分。这与其他语言(如等)相同。