Node.JS 中的正则表达式会产生意外的匹配



这是我在 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

谢谢维克托!

相关内容

  • 没有找到相关文章

最新更新