我在堆栈溢出中找到了这个很棒的正则表达式,并添加了我的手机验证所需的其他格式。但现在我被要求允许以下内容:
(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);
答案 0 :(得分:2)
对于那些不熟悉正则表达式的人来说,有更好的方法可以做到这一点,但不太清晰。因此,如果您想继续使用此方法,您应该首先了解这里发生了什么。
您正在将自定义语法转换为正则表达式,您需要关注的是要转换为任何数字的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);