这是我在 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 的数字时,发生了一件奇怪的事情,例如:
099 012345678在不应该的时候有资格成为有效数字(奇怪)
099 0123456不应该是一个有效的数字,它不是一个(逻辑)
099 01234567应该符合有效数字的条件,并且确实如此(逻辑)
099 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 就不会打扰您。
如果将匹配项锚定在字符串末尾,为什么要使用全局修饰符?此外,如果您需要匹配整个字符串,请在开头添加 ^。还应删除管道符号,因为它们被视为字符类中的文字管道符号。您也可以只使用字符类中的范围。Use/^(0|+98)9[0-49][0-9]{8}$/.
– Wiktor Stribiżew
谢谢维克托!