2013-03-12 69 views
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

我不明白的符号“?”,这是多次使用这个正则表达式。看起来“:”不在chartsheet

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

+1

它使子模式不捕获 – arnaud576875 2013-03-12 21:12:01

+2

对于一些额外的解释检查[this](http://stackoverflow.com/q/3512471/557306)question/ – sidyll 2013-03-12 21:13:40

回答

2
(?:) 

代表非捕获组。见perldoc perlre是恕我直言,最先进的语言与正则表达式玩:举例,意味着Perl兼容的正则表达式,是PHPpcregrepgrep -P默认)

perl的文档的相关部分:

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

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

请参阅使用这个例子:

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

正如你可以看到,第一个匹配的捕获组($1)不是az但该行的其余部分。这与其他语言如等的作用相同。

+0

谢谢。我刚在((?i:(?= [MDCLXVI]))((M {0,3})((C [DM])|(D?C))中找到类似的符号' {0,3}))((X [LC])|(L XX {0,2})|?L)((I [VX])|?(V(II {0,2})?) | V)))'?有什么想法吗? – JackWM 2013-03-12 21:29:18

+1

@JackWM,'(?i:...)'是开启与个案无关匹配的内联修饰符“i”与非捕获组的组合。意思是:该组内的模式不区分大小写,并且不被捕获。 – stema 2013-03-12 21:36:19

+0

新增说明和perl文档 – 2013-03-12 21:45:06

7

(?:...)仅仅是一个非捕获组,是指由该组匹配不被存储并且不能被$1\1

捕获组来访问由开口括号的编号的字符串的一部分,所以

对于例如文本 “Foobar的测试”

  1. 下面是两个捕获组

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

    这将导致:

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

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

    这将导致:

    $1 = "test" 
    
+0

你能举个例子吗?谢谢。 – JackWM 2013-03-12 21:18:35

+1

@JackWM,一个什么样的例子? sidyll的链接有一个很好的例子解释。 – stema 2013-03-12 21:21:56

+0

@JackWM,我加了一个例子。 – stema 2013-03-12 21:37:25

2

(?:...)是一个没有n捕获组,即控制运算符优先级,但不会创建匹配组。

+0

你能举个例子吗?谢谢。 – JackWM 2013-03-12 21:18:16

相关问题