我有这条VBNet代码,我想将其翻译成javascript:
Dim phone_check_pattern = "^(\+?|(\(\+?[0-9]{1,3}\))|)([ 0-9.//-]|\([ 0-9.//-]+\))+((x|X|((e|E)(x|X)(t|T)))([ 0-9.//-]|\([ 0-9.//-]+\)))?$"
System.Diagnostics.Debug.WriteLine(System.Text.RegularExpressions.Regex.IsMatch("test input", phone_check_pattern))
我的翻译结果:
var phone_check_pattern = "^(\+?|(\(\+?[0-9]{1,3}\))|)([ 0-9.//-]|\([ 0-9.//-]+\))+((x|X|((e|E)(x|X)(t|T)))([ 0-9.//-]|\([ 0-9.//-]+\)))?$";
alert(new RegExp(phone_check_pattern).test("test input"))
但是,当我运行它时,它有错误Uncaught SyntaxError: Invalid regular expression:: Nothing to repeat
(我的VbNet代码没有任何错误)
有谁知道是什么导致了这个问题?
答案 0 :(得分:7)
JavaScript字符串中的反斜杠字符是转义字符,因此字符串中的反斜杠会转义字符串的下一个字符,而不是正则表达式。所以就在开头附近,在你的"^(\+?
中,反斜杠就会逃脱+
的字符串(它不需要),而regexp看到的是只是一个原始的+
,没有什么可重复的。因此错误。
幸运的是,JavaScript有正则表达式的字面语法(用/
个字符分隔),这可能是一个更好的起点:
var re = /^(\+?|(\(\+?[0-9]{1,3}\))|)([ 0-9.\/-]|\([ 0-9.\/-]+\))+((x|X|((e|E)(x|X)(t|T)))([ 0-9.\/-]|\([ 0-9.\/-]+\)))?$/;
alert(re.test("test input"));
然后至少反斜杠在正则表达式中逃逸,而不是字符串。 (注意,由于/
是正则表达式文字的分隔符,我们必须将其转义(使用反斜杠)。)
我没有详尽地审查实际的正则表达式,但这应该让你开始。
有关the spec中正则表达式文字的更多信息,当然还有here on MDC。
答案 1 :(得分:2)
我不确定但是在您的javascript代码中尝试使用\\
代替\
。看过一些这样做的样本。
答案 2 :(得分:1)
正如大家所说,双重斜线很重要。这有效:
var phone_check_pattern = "^(\\+?|(\\(\\+?[0-9]{1,3}\\))|)"+
"([ 0-9.//-]|\\([ 0-9.//-]+\\))+"+
"((x|X|((e|E)(x|X)(t|T)))([ 0-9.//-]|\\([ 0-9.//-]+\\)))?$";
var re = new RegExp(phone_check_pattern);
say(re.test("test input"));
say(re.test("(415) 828-3321"));
say(re.test("+1 (212) 828-3321"));
say(re.test("da828-3321"));