【问题标题】:Phone ReGex to accept also letters after checking the first 3 or 4检查前 3 个或 4 个后,电话 ReGex 也接受字母
【发布时间】:2013-04-13 16:29:01
【问题描述】:

我在堆栈溢出中发现了这个很棒的正则表达式,并添加了我的电话验证所需的其他格式。但现在我被要求允许以下内容:

(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);

【问题讨论】:

  • 值得指出的是,您的表达式只会验证美国格式的电话号码。大多数海外国家使用不同的格式。这对您来说可能很重要,也可能无关紧要,具体取决于您的目标受众,但为了其他可能稍后阅读此问题的人的利益,无论如何都值得一提。

标签: javascript regex phone-number


【解决方案1】:

有更好的方法可以做到这一点,但对于那些不熟悉正则表达式的人来说不太容易理解。所以如果你想继续使用这种方法,你应该先了解这里是怎么回事。

您正在将自定义语法转换为正则表达式,您需要关注的是您要转换为任何数字的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);

【讨论】:

  • 你是个了不起的人,谢谢你的解释。现在很清楚了。我选择这个的原因是因为最终我们会构建一些东西让用户选择他们的验证。
  • @ergwin,FWI:我刚刚对其进行了测试并对第 5 行进行了小修改。
猜你喜欢
  • 2020-01-08
  • 1970-01-01
  • 2019-08-05
  • 2019-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多