【问题标题】:Regex fails in javascript正则表达式在 javascript 中失败
【发布时间】:2012-06-01 21:23:27
【问题描述】:

我在 javascript 中有以下正则表达式

var reg = new RegExp("^[(]?[2-9]\d{2}[)]?[\-. :]?[2-9]\d{2}[\-. :]?\d{4}$");
return this.optional(element) || (reg.test(value));

在我的代码 reg.test(value) 中,即使值正确也返回 false:例如 222 222 2222 或 222-222-2222。所有正则表达式测试器(尤其是this 一个,它调用相同的方法)显示正则表达式匹配表达式。可能是什么问题?

【问题讨论】:

    标签: javascript regex validation


    【解决方案1】:

    试试这个:

    var reg = /^[(]?[2-9]\d{2}[)]?[\-. :]?[2-9]\d{2}[\-. :]?\d{4}$/;
    return this.optional(element) || (reg.test(value));
    

    也可以:

    var reg = new RegExp("^[(]?[2-9]\\d{2}[)]?[\\-. :]?[2-9]\\d{2}[\\-. :]?\\d{4}$");
    return this.optional(element) || (reg.test(value));
    

    【讨论】:

    • 这个找了很久!不知道我们必须双重转义特殊字符,如 \s --> \\s :)
    • 非常感谢,试了很多,没意识到\应该换成\\
    • 如何正确转义双引号? (") 由于字符串文字中的 \" 对其进行了转义,但就模式匹配而言,\\" 会导致您的脚本无效?
    • 在这种情况下你应该添加\\\"
    【解决方案2】:

    \s 正在被字符串字面量吞噬。

    您应该改用正则表达式:

    var reg = /^[(]?[2-9]\d{2}[)]?[\-. :]?[2-9]\d{2}[\-. :]?\d{4}$/;
    

    【讨论】:

      【解决方案3】:

      我发现了一个潜在的麻烦原因:如果您要使用 RegExp 函数创建新的正则表达式,则必须两次转义反斜杠 - 一次用于 JavaScript 引擎,一次用于 RegEx 引擎。

      您可以通过以下方式测试这是否导致问题

      var reg = /^[(]?[2-9]\d{2}[)]?[\-. :]?[2-9]\d{2}[\-. :]?\d{4}$/;
      

      【讨论】:

        【解决方案4】:

        您将正则表达式作为字符串输入,因此所有出现的\d 都应该是\\d,因为当正则表达式字符串发送到解释器时,\d 字符不会被解释为\d 但只是 d 添加额外的斜杠会转义另一个斜杠,因此 \\d 被解释为 \d。另外我建议另一种更改,[(] 应该替换为\\(,因为字符类只包含一个字符,因此没有意义。

        【讨论】:

          猜你喜欢
          • 2014-11-05
          • 1970-01-01
          • 1970-01-01
          • 2018-04-24
          • 1970-01-01
          • 2021-10-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多