我试图为JS写一个或多或少复杂的regEx。它通过了我的所有测试,除了两个,我不知道为什么。这是代码
function telephoneCheck(str) {
regEx1 = /^[1]\s(\d{3}[-]){2}\d{4}|(\d{3}[-]){2}\d{4}$/;
regEx2 = /^\d{10}$/;
regEx3 = /^[1]\s(\d{3}\s){2}\d{4}|(\d{3}\s){2}\d{4}$/;
regEx4 = /^[1]\s[(]{1}\d{3}[)]{1}\d{3}[-]{1}\d{4}|[(]{1}\d{3}[)]{1}\d{3}[-]{1}\d{4}$/;
regEx5 = /^[1]\s[(]{1}\d{3}[)]{1}\s\d{3}[-]{1}\d{4}|[(]{1}\s\d{3}[)]{1}\d{3}[-]{1}\d{4}$/;
if (regEx1.test(str) || regEx2.test(str) || regEx3.test(str) || regEx4.test(str) || regEx5.test(str)) {
return true;
}
else {
return false;
}
}
这些是它没有正确传递的两个测试(两者都应该返回false
但我得到true
代替:telephoneCheck("2(757)622-7382")
和telephoneCheck("(555-555-5555")
。
我的问题是如何正确使用|
(或)运算符(我认为这会使我的代码看起来更好)以及如何在regEx中描述一个表达式以匹配特定字符(例如&#34 ; 1"在数字的开头)?我是使用[1]{1}
或[1]$
完成的,但它似乎无法正常工作。
感谢任何提示和建议!
答案 0 :(得分:2)
如何在regEx中描述一个表达式以匹配特定字符(例如" 1"在数字的开头)
要匹配特定字符,只需使用该字符即可。 x
是一个有效的正则表达式字符串,它匹配字母" x"。要匹配特殊字符,请先将其转义。正则表达式.
将匹配任何字符;正则表达式\.
将匹配一个句点。
请注意,正则表达式x
相当于[x]
,因为它们会匹配相同的内容,但前者更短且更易于阅读。如果给出了选择,只需直接使用单个字符(必要时进行转义!)并忘记[ ]
。
您的正则表达式包含[-]
,[(]
和[1]
等表达式。放下方括号。在第二个,你需要逃避(
。
[(]{1}
等表达式等同于\(
。 {1}
只是意味着匹配前一个项目一次。好吧,使用该项目本身也可以完成同样的事情。两个字符比六个字符短很多,这将使你的正则表达式更容易阅读。
如何使用| (或)操作员正确
使用|
运算符非常简单。它将匹配左侧或右侧的内容。将其括在括号中以限制匹配。例如,a|bc
将匹配" a"或" bc"。 (a|b)c
将匹配" ac"和" bc"。
答案 1 :(得分:0)
您遇到的主要问题是,^
和$
锚点只会在|
所在的一侧发挥作用。但是,您希望其中任何一方的所有模式都与^
和$
匹配。
因此,不是^ | $
,而是^( | )$
或^ $|^ $
。
正如其他人所说,你可以简化很多。