我必须在字符串中找到有条件的电话号码:
0
10
或11
号0
- 9
"-"
(不在开头或结尾)示例:01234567890
,01-234567890
,03-1234-12345
。
我的正则表达式,但它不起作用:
/\d+{10,11}|(\d+\-\d+){11,12}|(\d+\-\d+\-\d+){12,13}/
答案 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模式对于没有破坏的情况仍然有错\d{11,12}
,不能生成另一个Rubular:P
EDIT2:想到更好的方法。
(?=(?:\d-?){10,11}(?![\d-]))\d+(-\d+){0,2}(?![\d-])
确保有10-11位,并确保有0-2的破折号。锚点的想法与前一个想法相同。