正则表达式解释`(?...)`和`(2)`

时间:2011-05-09 04:57:35

标签: php regex

我需要帮助理解一些正则表达式。我看到像

这样的代码
preg_match("/^ 

            (1[-\s.])?  # optional '1-', '1.' or '1' 
            ( \( )?     # optional opening parenthesis 
            \d{3}       # the area code 
            (?(2) \) )  # if there was opening parenthesis, close it 
            [-\s.]?     # followed by '-' or '.' or space 
            \d{3}       # first 3 digits 
            [-\s.]?     # followed by '-' or '.' or space 
            \d{4}       # last 4 digits 

            $/x",$number)

我理解了所有人但却不明白(?(2) \) )如何真正起作用......那是什么意思? (2)代表。

问题更新......

我读了你所有的答案..当我改变代码时

preg_match("/^ 

            (1[-\s.])?  # optional '1-', '1.' or '1' 
            \d{3}       # the area code 
            ( \( )?     # optional opening parenthesis 
            (?(3) \) )  # if there was opening parenthesis, close it 
            [-\s.]?     # followed by '-' or '.' or space 
            \d{3}       # first 3 digits 
            [-\s.]?     # followed by '-' or '.' or space 
            \d{4}       # last 4 digits 

            $/x",$number)

我收到错误

Compilation failed: reference to non-existent subpattern   

代码是否有任何错误?

3 个答案:

答案 0 :(得分:3)

(2)表示第二个匹配的片段,来自此处:( \( )?。 所以整行都是这样的:如果第二个片段匹配(意味着有左括号),那么我们需要确保有右括号。

答案 1 :(得分:2)

(2)表示条件#2或者您可以说第二个捕获组,这意味着第二个()中的条件。这意味着如果有(则必须b )

Read here

(?(1)then|else)

意味着如果第一个捕获组参与到目前为止的匹配尝试,则“then”部分必须匹配整个正则表达式才能匹配。如果第一个捕获组没有参加比赛,则“else”部分必须匹配整个正则表达式才能匹配。

eg: (a)?(?(1)b|c) matches ab, the first c and the second c in babxcac

Also in PHP

答案 2 :(得分:1)

猜它说它做了什么,寻找存储在第二个结果中的区号,如果是,它也应该被关闭。这意味着这可能是某种'如果结果-2有效=> close,else =>无”。

正则表达式不是我最好的朋友,所以我希望我是对的...但我也很难解释/创建它们,所以也许现在任何人都可以在这里教我一件事; - )

顺便说一句,如果你谷歌搜索“PHP正则表达式备忘单”,那么你可能会感兴趣的是一些结果,至少它们对我来说很有趣。