javascript - 电话 ReGex 在检查前 3 或 4 个字母后也接受字母

标签 javascript regex phone-number

我在堆栈溢出中找到了这个很棒的正则表达式,并添加了我的手机验证所需的其他格式。但现在我被要求允许以下操作:

(555)YOU-RULE
(555) MEI-YOUN
(555)YOURULE
555YOURULE
555 YOU RULE
555-YOU-RULE

以上所有内容都前面有 1。鉴于我下面针对非字母数字的解决方案,我不确定如何做到这一点

仅限数字:

  var formats = "(999)999-9999|999-999-9999|(999) 999-9999|1(999) 999-9999|1(999)999-9999|999 999 9999|999.999.9999|1.999.999.9999|9999999999";
  var r = RegExp("^(" +
       formats
         .replace(/([\(\)])/g, "\\$1")
         .replace(/9/g,"\\d") +
       ")$");
    phoneOK = r.test(phone);

最佳答案

有更好的方法可以做到这一点,但是对于那些不熟悉正则表达式的人来说不太清晰。所以如果你想继续使用这个方法,你应该首先了解这里发生了什么。

您正在将自定义语法转换为正则表达式,您需要关注的是要转换为任何数字的 9,您需要允许它是任何数字或字母.

此转换发生在第 5 行:

.replace(/9/g,"\\d") +

\d 是任何数字的术语,因此我们必须使其表示任何数字或字母。最简单的方法可能是将其更改为 [\dA-Z]。我在这里假设您只需要大写,如果您也想要小写,请将其更改为:[\dA-Za-z]

.replace(/9/g,"[\\dA-Z]") +

但是,从您的示例来看,您似乎也只需要前三位数字。这将需要一个新的规则。我们将其命名为 0 并相应地更新格式:

var formats = "(000)999-9999|000-999-9999|(000) 999-9999|1(000) 999-9999|1(00)999-9999|000 999 9999|000.999.9999|1.000.999.9999|0009999999";

现在在第 5 行之后添加转换:

.replace(/0/g,"\\d") +

您会注意到它与旧的第 5 行相同。

所以我们总共得到:

var formats = "(000)999-9999|000-999-9999|(000) 999-9999|1(000) 999-9999|1(00)999-9999|000 999 9999|000.999.9999|1.000.999.9999|0009999999";
var r = RegExp("^(" +
   formats
     .replace(/([\(\)])/g, "\\$1")
     .replace(/9/g,"[\\dA-Z]")
     .replace(/0/g,"\\d") +
   ")$");
phoneOK = r.test(phone);

关于javascript - 电话 ReGex 在检查前 3 或 4 个字母后也接受字母,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15990095/

相关文章:

validation - 10 位电话号码...在美国够用吗?

javascript - 如何在 DOM CSS 中使用变量

javascript - 为什么 jQuery 仅在加载停止时才加载?

javascript - 为什么嵌套一堆 block 会导致 JavaScript 中的堆栈溢出

python - 在特定字符串后匹配重复模式

PHP 正则表达式匹配字符串中的组

javascript - 谷歌函数 : TypeError: Cannot read property 'name' of undefined

php - 将 UTF-8 字符存储在 ANSI 文件中 [PHP][REGEX]

reactjs - React 电话号码输入格式和无格式输出

java - 使用 Hibernate 注释验证手机号码