2

我从 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

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

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

4

3 回答 3

7

(?:...)只是一个非捕获组,表示与该组匹配的字符串部分不存储并且不能被访问$1或访问\1

捕获组由左括号编号,因此

对于示例文本“Foobar 测试”

  1. 这是两个捕获组

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

    这将导致:

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

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

    这将导致:

    $1 = "test" 
    
于 2013-03-12T21:11:58.880 回答
2

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

于 2013-03-12T21:12:06.243 回答
2
(?:)

代表非捕获组。请参阅perldoc perlre(恕我直言, 是使用 REGEX 的最高级语言:例如,表示Perl 兼容正则表达式,是PHP,pcregrep或 with的默认值grep -P

perl doc 的相关部分:

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

这是用于聚类,而不是捕获;它对像“()”这样的子表达式进行分组,但不像“()”那样进行反向引用。

请参阅使用的示例:

$ echo 'azfoobar' | perl -lne 'print $1 if /^(?:az)(.*)/'
foobar

如您所见,第一个匹配的捕获组 ( $1) 不是az该行的其余部分。这与其他语言(如等)相同。

于 2013-03-12T21:23:38.447 回答