2017-07-27 58 views
-1

我试图为JS编写一个或多或少复杂的regEx。它通过我所有的测试,除了两个,我不知道为什么。这是代码如何正确使用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中的表达式以匹配特定字符(例如,开始处的“1”的数量)?我做了[1]{1}[1]$,但它似乎没有工作。 感谢您的任何提示和建议!

+1

太多问题:关注一个。 – trincot

+0

不需要'{1}'。 – trincot

回答

2

如何我描述中的正则表达式的表达式来(在号码的开头的例如“1”)匹配特定字符

要匹配特定的字符,只要使用该字符。 x是匹配字母“x”的有效正则表达式字符串。要匹配一个特殊字符,请先将其转义。正则表达式.将匹配任何字符;正则表达式\.将匹配一个句点。

请注意,正则表达式x相当于[x]因为它们将匹配相同的东西,但前者更短,更易于阅读。在给出选择的情况下,直接使用单个字符(如有必要,请转义)并忘记[ ]

你的正则表达式包含表达式,如[-],[(][1]。放下括号。在第二个,你将需要逃避(

[(]{1}等表达式相当于\({1}只是意味着匹配上一个项目一次。那么使用该项目本身就可以完成同样的事情。两个字符比六个短很多,并且会使您的正则表达式更易于阅读。

如何使用| (或)运营商

使用|运算符非常简单。它将匹配左侧或右侧的内容。用圆括号括起来限制匹配。例如,a|bc将匹配“a”或“bc”。 (a|b)c将匹配“ac”和“bc”。

+0

非常好的和详细的解释,谢谢@艾米! –

0

您遇到的主要问题是^$锚点只会在|的旁边进行操作。但是你会希望你在它的任何一边都有的图案可以与^$匹配。

因此,而不是^ | $,做^( | )$^ $|^ $

正如其他人所说,你可以简化很多。