【问题标题】:How to compare two regexps?如何比较两个正则表达式?
【发布时间】:2012-06-14 12:10:29
【问题描述】:

为什么

console.log(/a/ == /a/);

var regexp1 = /a/;
var regexp2 = /a/;
console.log(regexp1 == regexp2);

都返回false?

【问题讨论】:

    标签: javascript regex compare


    【解决方案1】:

    试试这个:

    String(regexp1) === String(regexp2))
    

    你弄错了,因为这两个是不同的对象。

    【讨论】:

    • error.errorVal.requiredPattern.toString() == ("^(0|[1-9]\d*)(.\d+)?$").toString() false //不工作 error.errorVal.requiredPattern "^(0|[1-9]\d*)(.\d+)?$"
    • 我试图转换为字符串,但它不起作用..
    • 如果使用new 创建字符串,您需要调用 valueOf 因为正在创建对象(而不是原始字符串文字) - 例如(new String(regexp1)).valueOf() === (new String(regexp2)).valueOf()
    【解决方案2】:

    “问题”:

    regex 是一个object——一个引用类型,所以比较是通过引用完成的,它们是两个不同的对象。

    console.log(typeof /a/); // "object"
    

    如果两个操作数都是对象,那么当操作数引用内存中的同一个对象时,JavaScript 会比较相等的内部引用。

    MDN

    解决方案:

    ​var a = /a/;
    var b = /a/;
    console.log(​​​a.toString() === b.toString()); // true! yessss!
    

    Live DEMO

    另一个在regexes 上强制toString() 的“黑客”是:

    console.log(a + "" === b + "");​
    

    【讨论】:

    • error.errorVal.requiredPattern.toString() == ("^(0|[1-9]\d*)(.\d+)?$").toString() false //不工作 error.errorVal.requiredPattern "^(0|[1-9]\d*)(.\d+)?$"
    • 当我使用响应式表单错误并尝试与我在验证器中插入的相同模式匹配时,它不起作用
    【解决方案3】:

    只是一个猜测 - 但 JavaScript 不会为您的正则表达式创建一个 RegExp 对象,因此因为您创建了两个不同的对象(即使它们具有相同的“值”)它们实际上是不同的?

    【讨论】:

      【解决方案4】:

      对于像 int、string、boolean 这样的原始数据类型,javascript 知道要比较什么,但对于像 date 或 regex 这样的对象,运算符只查看内存中的位置,因为您独立定义正则表达式,它们在内存中有两个不同的位置,所以他们是不平等的。

      【讨论】:

        猜你喜欢
        • 2017-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-10
        相关资源
        最近更新 更多