我必须在字符串中找到有条件的电话号码:
0
10
或11
数字0
-9
"-"
(不在开头或结尾)例如:01234567890
,01-234567890
,03-1234-12345
。我的正则表达式,但它不起作用:
/\d+{10,11}|(\d+\-\d+){11,12}|(\d+\-\d+\-\d+){12,13}/
这有点棘手。首先,您的正则表达式具有正确的想法。鉴于长度随破折号的数量而变化,我们需要分别检查每种情况。(也许有更好的方法,但是我想不出来。)但是,(\d+-\d+){11,12}
这并不意味着“长度为11-12”,而是“ 11-12重复\d+-\d+
,给您超过11-12个字符的方式。甚至如果是正确的话,由于析取的顺序,您将无法匹配0123456789-1
,因为将首先找到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
编辑2:想到了一种更好的方法。
(?=(?:\d-?){10,11}(?![\d-]))\d+(-\d+){0,2}(?![\d-])
确保有10-11个数字,并确保有0-2个破折号。锚点的想法与上一个相同。
小叶。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句