C# 将正则表达式从.NET转换为javascript时出错

C# 将正则表达式从.NET转换为javascript时出错,c#,javascript,vb.net,web-services,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.IsMat

我想将这段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"))
但是,当我运行它时,它有错误
未捕获的语法错误:无效的正则表达式::无需重复

(但我的VbNet代码没有任何错误)


有人知道问题的原因吗?

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"));
然后,至少反斜杠在正则表达式中转义,而不是在字符串中转义。(注意,由于
/
是正则表达式文本的分隔符,我们必须转义它(使用反斜杠)。)

我还没有详尽地回顾实际的regexp,但这应该可以让您开始


当然,和中的正则表达式文本的更多信息。

我不确定,但尝试在javascript代码中使用
\\
而不是
\
。看到了一些这样做的示例。

正如大家所说的,双斜杠很重要。这很有效:

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

@Pacerier你能告诉我们正则表达式应该做什么吗。@sra:他正在挑战强大的(有些人甚至会说是吉诃德式的)验证在自由格式字段中输入的电话号码的任务。不适用于心脏虚弱的人,并且容易出现各种问题。@sra在问题中,在code@Pacerier哦,是的。接下来我应该仔细阅读:)