如何比较两个正则表达式?

31
为什么要这样做?
console.log(/a/ == /a/);

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

两者都返回false

4个回答

56

试试这个:

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

你得到 false 是因为这两个对象是不同的。


error.errorVal.requiredPattern.toString() == ("^(0|[1-9]\d*)(.\d+)?$").toString() false // 不起作用 error.errorVal.requiredPattern "^(0|[1-9]\d*)(.\d+)?$" - Bravo
我尝试将其转换为字符串,但它没有起作用。 - Bravo
如果使用new来创建字符串,你需要调用valueOf方法,因为它会创建一个对象(而不是原始的字符串字面量)- 例如:(new String(regexp1)).valueOf() === (new String(regexp2)).valueOf() - Shaun

14

问题:

regex是一个引用类型object,因此比较是按照引用进行的,这两个对象是不同的。

console.log(typeof /a/); // "object"
如果两个操作数都是对象,则 JavaScript 比较内部引用,当操作数在内存中引用同一对象时相等。
参考自:MDN
​var a = /a/;
var b = /a/;
console.log(​​​a.toString() === b.toString()); // true! yessss!

实时演示

强制执行regextoString()的另一种“hack”方法是:

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

error.errorVal.requiredPattern.toString() == ("^(0|[1-9]\d*)(.\d+)?$").toString() false // not working error.errorVal.requiredPattern "^(0|[1-9]\d*)(.\d+)?$" - Bravo
当我使用响应式表单错误并尝试与我在验证器中插入的相同模式匹配时,它无法正常工作。 - Bravo

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

2

对于像int、string、boolean这样的原始数据类型,JavaScript知道如何进行比较,但对于像日期或正则表达式这样的对象,该运算符只查看内存中的位置,因为您独立定义了正则表达式,它们在内存中有两个不同的位置,所以它们是不相等的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接