Javascript正则表达式;执行官;方法:记忆错误/效果

Javascript正则表达式;执行官;方法:记忆错误/效果,javascript,regex,node.js,Javascript,Regex,Node.js,获取并执行以下代码: str1='foobar\nFooBar'; str2='FooBar\nfobar'; r=/foo/gi; res1=r.exec(str1); res2=r.exec(str2); console.log(res1、res2)这是预期行为,如(我的重点)所示: 如果匹配成功,则exec()方法返回一个数组并更新正则表达式对象的属性。返回的数组将匹配的文本作为第一项,然后将匹配的每个捕获括号作为一项,该括号包含捕获的文本 此行为是正则表达式对象的属性,而不是正则表达式

获取并执行以下代码:

str1='foobar\nFooBar';
str2='FooBar\nfobar';
r=/foo/gi;
res1=r.exec(str1);
res2=r.exec(str2);

console.log(res1、res2)这是预期行为,如(我的重点)所示:

如果匹配成功,则
exec()
方法返回一个数组并更新正则表达式对象的属性。返回的数组将匹配的文本作为第一项,然后将匹配的每个捕获括号作为一项,该括号包含捕获的文本

此行为是正则表达式对象的属性,而不是正则表达式引擎的属性。您可以通过不使用正则表达式对象看到差异:

str1='foobar\nFooBar';
str2='FooBar\nfobar';
r=/foo/gi;
res1=r.exec(str1);
res2=r.exec(str2);
console.log(res1、res2);
//没有目标
log(/foo/gi.exec(str1));

log(/foo/gi.exec(str2))不,这不是一个bug。正则表达式不知道它是否得到相同的字符串。这并不意味着它“不是一个bug”。使用哈希表对回忆录函数进行编码以将输入与回忆录结果相匹配是可能的,也是常见的。新的输入,新的结果。我没说这不是一个bug。我只是告诉你不是一个。无论如何,如果它确实使用了memorization,它会在字符串的引用上还是在字符串的值上?如果对具有相同字符的新字符串进行不同的引用,该怎么办?那是一根新弦吗?如果向字符串中添加新内容,并希望继续之前的内容,该怎么办?不管怎样,总会有一些行为打破人们的期望。对象只接受其输入并以最简单的方式进行操作。它的状态只与它的调用相关联,与输入无关。我理解
exec
的功能。我认为这在某种程度上是违反直觉的,这使它成为一个bug。关于您的评论:当然它应该散列字符串字符。就这样。字符串在JS中是不可变的,因此如果你操作它们,你总是会创建新的字符串,这也会使内存指针散列成为可能——这可能是违反直觉的。你没有抓住要点。是的,字符串是不可变的,但是想象一下这样一种情况:在对字符串进行其他操作时,正在解析该字符串。从该用户的角度来看,他们希望继续处理它,就好像它是相同的输入一样。然后让正在运行
exec()
的用户查看字符串列表,其中一些字符串可能匹配。突然间,有些比赛似乎是从任意点开始的。这不是一个双赢的局面,所以regex对象依赖于它自己的状态。关于缺陷是JS对象的一部分,而不是regex实现的一个优点,我们没有意识到这一点!我仍然认为这毫无意义,regex对象应该为每个字符序列/每个引用维护一个索引。您引用的规范并不意味着不应该出现这种情况。很好,谢谢。