这是我在Node中的正则表达式:
/(0|\+98)?9[0|1|2|3|4|9][0-9]{8}$/g
这是我在逻辑上的匹配条件:
phoneNumber = ABCD where:
A: country code (+98) || leading 0
B: must be a 9
C: must be a 0, 1, 2, 3, 4 or 9
D: eight digits from [0-9]
问题
当我测试C组件等于9的数字时,会发生奇怪的事情,例如:
09 9 012345678在不应该( STRANGE )
时符合有效数字09 9 0123456不应该有资格作为有效号码而且它没有(逻辑)
09 9 01234567应该有资格作为有效号码,它确实有(LOGICAL)
09 9 01234567 {..}不具备有效资格,他们不应该这样做。 (逻辑)
我在macOS 10.12.4上使用Node.JS v7.2.0和v6.10.3对此进行了测试 并在Ubuntu 16.04.2上
其他所有测试都会产生正确的结果:
090x ..,091x ..,092x ..,093x ..,094x .. - >匹配(正确)
+ 9891x .. - >匹配(正确)
095x ..,08xx .., - >没有比赛(正确)
091212345678 - >没有比赛(正确)
0912123456 - >没有比赛(正确)
等等......我怀疑这种奇怪的行为与两个9的重复有关;我用我的正则表达式玩了几个小时,最后放弃了。希望有人可以看到我的正则表达式的问题或指出Node的正则表达式中可能存在的错误......
以下是一些我没有运气的尝试
/(0|\+98)?(9[0|1|2|3|4] | 99)[0-9]{8}$/g
/(0|\+98)?(9[0|1|2|3|4|9])\d{8}$/g
/(0|\+98)?(90|91|92|93|94|99)[0-9]{8}$/g
/(0|\+98)?9(?=[0|1|2|3|4|9])[0|1|2|3|4|9][0-9]{8}$/g
解
当我完成上述写作并再多做一些时,我意识到我错误地输入了一个问号,即使我一直盯着它,我的眼睛也看不到它。睁大眼睛!
总结:
而不是额外的'?' 9之前[0 | 1 | 2 ..,
/(0|\+98)?9[0|1|2|3|4|9][0-9]{8}$/g
解决方案如下:
/(0|\+98)9[0|1|2|3|4|9][0-9]{8}$/g
希望这有助于解决类似的问题或 为伊朗手机号码提供正常工作的正则表达式。
如果您在输入字段中捕获文本,请记住修剪文本,并替换" - "," ","(",")"用""在用正则表达式测试之前。 所以0912 123 4567,0912-123-4567和(0912)123-4567不要误会你。
答案 0 :(得分:0)
如果将匹配锚定在字符串的末尾,为什么要使用全局修饰符?此外,如果您需要匹配整个字符串,请在开头添加^。您还应该删除管道符号,因为它们在字符类中被视为文字管道符号。您也可以在字符类中使用范围。使用/^(0|\+98)9[0-49][0-9]{8}$/.
- WiktorStribiżew
感谢Wiktor!