无法理解这种正则表达式格式(电话号码)

时间:2016-05-27 04:38:50

标签: php regex

我必须根据此正则表达式格式化电话号码:

/^\\+([0-9]){1,3}\\.([0-9]\\ ?){6,14}$/

对于我的生活,我无法弄清楚这一半的后半部分。我最大的努力让我在

  1. 必须以反斜杠
  2. 开头
  3. 然后是1-3位
  4. 然后是另一个反斜杠后跟任何字符
  5. ([0-9]\\ ?)
  6. 的6-14次迭代
  7. 字符串结尾
  8. 如果我到目前为止,我无法弄清楚#4的格式。或者我完全错了?

    我想说我有这个电话号码:+0018005551212或18005551212

    我如何形成这个号码?答案会很棒,但解释会更好。感谢!!!

2 个答案:

答案 0 :(得分:1)

不,很有可能\\是转义\,因为其中有另一个解释层会检测转义字符。在使用双引号字符串时,您经常在bash(作为一个示例)中看到这一点:

pax> echo '\' | sed 's/\\/x/'
x
pax> echo '\' | sed "s/\\\\/x/"
x

pax> echo '\' | sed 's/\/x/'
sed: -e expression #1, char 6: unterminated 's' command
pax> echo '\' | sed "s/\\/x/"
sed: -e expression #1, char 6: unterminated 's' command

使用双引号字符串,bash本身会在sed看到它们之前解释转义,因此您需要双重转义。使用单引号,bash不会解释字符串中的转义符,因此它们会按原样传递给sed

这是基于以下事实:虽然国际电话号码可以以+开头,但我从未看到其中有反斜杠的人。

所以规则是:

^                   start of string
\\+                 a literal +
([0-9]){1,3}        1-3 digits
\\.                 a literal .
([0-9]\\ ?){6,14}   6-14 digits, each with an optional following apace
$                   end of string

答案 1 :(得分:0)

以下是对当前正则表达式的解释,以及一些可以匹配的示例。

REGEX EXPLANATION

^                   assert position at start of a line
\\+                 matches the character \ literally one or more times
([0-9]){1,3}        capturing group matching a digit between 1 to 3 times
\\                  matches the character \ literally
.                   matches any character (except newline)
(                   start of another capturing group
  [0-9]             any digit between 0 to 9   
  \\                matches the character \ literally 
   ?                match a space zero or one time
){6,14}             repeat this pattern 6 to 14 times
$                   assert position at end of a line

您当前的正则表达式符合以下示例(对我来说看起来不像电话号码):

\1\+9\ 9\ 9\ 9\ 9\ 9\ 
\\\12\79\ 9\ 9\ 9\ 9\ 9\ 
\123\ 9\ 9\ 9\ 9\ 9\ 9\ 
\\124\A9\ 9\ 9\ 9\ 9\ 9\ 
\\124\_9\ 9\ 9\ 9\ 9\9\ 
\\124\_9\ 9\ 9\ 9\ 9\9\ 9\9\9\ 9\9\9\