测试正则表达式的相等性

Ran*_*lue 12 javascript

我很惊讶地看到了这一点

/a/ === /a/
Run Code Online (Sandbox Code Playgroud)

false在JavaScript中评估.阅读规范:

程序中的两个正则表达式文字计算为正则表达式对象,即使两个文字的内容相同,它们也绝不会相互比较为===.

既然===不能用于测试相等性,那么如何在JavaScript中测试正则表达式的相等性?

Ark*_*rka 18

这是一个甚至涵盖标志排序的案例.

function regexEqual(x, y) {
    return (x instanceof RegExp) && (y instanceof RegExp) && 
           (x.source === y.source) && (x.global === y.global) && 
           (x.ignoreCase === y.ignoreCase) && (x.multiline === y.multiline);
}
Run Code Online (Sandbox Code Playgroud)

测试:

regexEqual(/a/, /a/) // true
regexEqual(/a/gi, /a/ig) // also true.
regeXEqual(/a/, /b/) // false
Run Code Online (Sandbox Code Playgroud)

  • @Eric:No .toString()返回你输入的确切内容.它使用预定义的标志顺序来确保/ a/gi ===/a/ig. (2认同)

jfr*_*d00 6

这是一个可以完全测试所有相关正则表达式属性并确保它是正确对象类型的函数:

function regexSame(r1, r2) {
    if (r1 instanceof RegExp && r2 instanceof RegExp) {
        var props = ["global", "multiline", "ignoreCase", "source", "dotAll", "sticky", "unicode"];
        for (var i = 0; i < props.length; i++) {
            var prop = props[i];
            if (r1[prop] !== r2[prop]) {
                return false;
            }
        }
        return true;
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

并且,由于有时会用新功能将标记添加到正则表达式对象中(自2012年最初的回答以来就发生了这种情况-尽管以上代码已于2019年进行了更新),所以此版本对将来的标记有更多的未来证明被添加,因为它会比较那里的所有标志,而不是寻找一组特定的标志。它在比较之前对标志进行排序,以允许在正则表达式的指定方式上存在细微差异,而这些差异实际上并不会改变功能。

function regexSame(r1, r2) {
    return r1 instanceof RegExp && 
           r2 instanceof RegExp &&
           r1.source === r2.source &&
           r1.flags.split("").sort().join("") === r2.flags.split("").sort().join("");
}
Run Code Online (Sandbox Code Playgroud)