正则表达式验证电话号码

时间:2015-06-11 02:19:47

标签: ruby regex

我必须在字符串中找到有条件的电话号码:

  • 0
  • 开始
  • 10110 - 9
  • 最多2个字符"-"(不在开头或结尾)

示例:0123456789001-23456789003-1234-12345。 我的正则表达式,但它不起作用:

/\d+{10,11}|(\d+\-\d+){11,12}|(\d+\-\d+\-\d+){12,13}/

1 个答案:

答案 0 :(得分:2)

这有点棘手。首先,你的regexp有正确的想法。鉴于长度随破折号的变化而变化,我们需要分别检查每个案例。 (可能有更好的方法,但我无法想到一个。)但是,(\d+-\d+){11,12}并不意味着"长度为11-12",但是" 11- 12次重复\d+-\d+,超过11-12个字符。即使它是正确的,由于分离的顺序,你将无法匹配0123456789-1,因为首先会找到10个数字,而10个数字后跟破折号,另一个数字甚至不会被检查。

如果您尝试验证整个字符串,那会更容易,因为您可以使用锚点^$来查找结尾。没有它,它有点棘手:

(?=[\d-]{13,14}(?![\d-]))0\d+-\d+-\d+(?![\d-])|(?=[\d-]{12,13}(?!-|\d))0\d+-\d+(?![\d-])|\d{10,11}

第一部分(?=[\d-]{13,14}(?![\d-]))0\d+-\d+-\d+(?![\d-])检查双破折号模式。 (?=[\d-]{13,14}(?![\d-]))检查您是否有13-14个数字或短划线字符,之后您有数字或短划线。在确定存在这样的区域之后,我们确保在两个数字之间恰好有两个破折号(并且确保整个事物再次没有跟随数字或破折号 - 这个锚点在我们的前瞻中同步条件和在主要模式中)。

第二部分(?=[\d-]{12,13}(?!-|\d))0\d+-\d+(?![\d-])类似,检查一个短划线匹配。第三部分\d{10,11}非常简单,并且找到了无破折号匹配。

所有这一切都假设sawa的针刺在点上:0123456789-不匹配。如果是,你需要将一些加号变成星星。

Rubular

编辑:Rubular模式对于没有破坏的情况仍然有错\d{11,12},不能生成另一个Rubular:P

EDIT2:想到更好的方法。

(?=(?:\d-?){10,11}(?![\d-]))\d+(-\d+){0,2}(?![\d-])

确保有10-11位,并确保有0-2的破折号。锚点的想法与前一个想法相同。

Rubular