【发布时间】:2017-10-18 13:55:42
【问题描述】:
这是我在 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 的数字时,会发生奇怪的事情,例如:
099012345678 在不应该的情况下符合有效数字(STRANGE)
0990123456 不应该是一个有效的数字,它不是(逻辑)
09901234567 应该是一个有效的数字,它确实(逻辑)
09901234567{..} 不符合有效条件,也不应如此。 (逻辑)
我已经在 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|\+98)9[0-49][0-9]{8}$/。 -
请发布您的答案并将其标记为已解决。这样,没有人需要在您已经解决的问题上浪费时间。谢谢!
标签: javascript node.js regex validation mobile