【问题标题】:Regex in Node.JS produces an unexpected matchNode.JS 中的正则表达式会产生意外的匹配
【发布时间】: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


【解决方案1】:

如果将匹配项锚定在字符串的末尾,为什么要使用全局修饰符?此外,如果您需要匹配整个字符串,请在开头添加 ^。您还应该删除管道符号,因为它们在字符类中被视为文字管道符号。您也可以只使用字符类中的范围。使用/^(0|\+98)9[0-49][0-9]{8}$/. – Wiktor Stribiżew

感谢维克托!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-12
    相关资源
    最近更新 更多