javascript:编译器解释的一些问题//作为正则表达式中的注释

时间:2011-05-09 11:25:34

标签: javascript regex syntax comments

我有这个正则表达式来验证电话号码

^(\+?|(\(\+?[0-9]{1,3}\))|)([ 0-9.//-]|\([ 0-9.//-]+\))+((x|X|((e|E)(x|X)(t|T)))([ 0-9.//-]|\([ 0-9.//-]+\)))?$

我从我的C#/ vb库中挖出来,现在我想把它翻译成javascript。但它有语法错误(我怀疑它是由于//字符引起的)。我的尝试:

$IsPhone = function (input) {
  var regex = new window.RegExp("^$|^(\+?|(\(\+?[0-9]{1,3}\))|)([ 0-9.//-]|\([ 0-9.//-]+\))+((x|X|((e|E)(x|X)(t|T)))([ 0-9.//-]|\([ 0-9.//-]+\)))?$", "");
  return regex.test(input.trim());

};
alert($IsPhone("asd"));

2 个答案:

答案 0 :(得分:4)

您的问题与评论无关。您只是混合了创建RegExp对象的两种不同方法。

在JavaScript代码中创建RegExp对象时,可以将其写为字符串文字,然后传递给RegExp构造函数,或者作为正则表达式文字。因为字符串文字支持反斜杠转义序列,如\n\",所以字符串中的任何实际反斜杠也必须进行转义。因此,只要您需要转义(+等正则表达式字符,就必须使用两个反斜杠,如下所示:

var r0 = "^$|^(\\+?|(\\(\\+?[0-9]{1,3}\\))|)([ 0-9./-]|\\([ 0-9./-]+\\))+((x|X|((e|E)(x|X)(t|T)))([ 0-9./-]|\\([ 0-9./-]+\\)))?$";
var regex0 = new RegExp(r0, "");

正斜杠对正则表达式或字符串没有特殊意义。你必须转义正斜杠的唯一原因是因为它们被用作正则表达式文字的分隔符。您可以使用反斜杠来转义正斜杠,就像使用\(\+等正则表达式字符或反斜杠本身一样:\\。这是你的正则表达式的正则表达式 - 文字版本:

var regex1 = /^$|^(\+?|(\(\+?[0-9]{1,3}\))|)([ 0-9.\/-]|\([ 0-9.\/-]+\))+((x|X|((e|E)(x|X)(t|T)))([ 0-9.\/-]|\([ 0-9.\/-]+\)))?$/;

答案 1 :(得分:1)

来自Errors translating regex from .NET to javascript

  

JavaScript中的反斜杠字符   strings是一个转义字符,所以   你的字符串中有反斜杠   正在逃避下一个角色   字符串,不适用于常规字符串   表达。所以就在附近   开头,在你的“^(+ ?, the   反斜杠那里只是逃避了+ for   字符串(它不需要),   而正则表达式看到的只是一个原始的   +没有什么可重复的。因此错误。