【问题标题】:javascript: some problem with compiler interpreting // as comments in regexjavascript:编译器将//解释为正则表达式中的注释的一些问题
【发布时间】:2011-08-21 15:03:58
【问题描述】:

我有这个用于验证电话号码的正则表达式

^(\+?|(\(\+?[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"));

【问题讨论】:

  • 您能否提供一些有关您的表达式试图匹配的内容的上下文?这将使调试更容易。
  • 你有没有试图避开斜线?
  • 这是什么? “找不同”的游戏?无论如何,如果是语法错误,我会尝试使用 JSLint。
  • 为什么还需要双斜线? AFAICS,他们在一个字符类中,所以应该只有一个。
  • 我猜你想写[ 0-9./-]而不是[ 0-9.//-](把它写两次没有任何意义,并且可能导致正则表达式有缺陷)

标签: javascript regex syntax comments


【解决方案1】:

您的问题与 cmets 无关。您只是混淆了创建 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, "");

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

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

【讨论】:

    【解决方案2】:

    来自Errors translating regex from .NET to javascript

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-02
      • 1970-01-01
      • 2014-12-17
      • 1970-01-01
      • 2014-07-26
      • 2020-05-02
      • 1970-01-01
      相关资源
      最近更新 更多