将正则表达式从.NET转换为javascript的错误

时间:2011-05-19 08:01:50

标签: c# javascript vb.net web-services

我有这条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代码没有任何错误)

有谁知道是什么导致了这个问题?

3 个答案:

答案 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"));