javascript regexp(|)管道操作符的工作方式是否与(| |)逻辑操作符的工作方式相同?
我知道javascript中的regexp或(|)运算符匹配regexp两侧的一个子字符串 我还知道,在JavaScript中,逻辑(| |)OR运算符仅在第一个操作数为false时才检查第二个操作数 所以我想知道regexp(|)(也称为pipe)或操作符的工作方式是否相同,或者它首先匹配两个子字符串,然后决定匹配。javascript regexp(|)管道操作符的工作方式是否与(| |)逻辑操作符的工作方式相同?,javascript,regex,logical-operators,Javascript,Regex,Logical Operators,我知道javascript中的regexp或(|)运算符匹配regexp两侧的一个子字符串 我还知道,在JavaScript中,逻辑(| |)OR运算符仅在第一个操作数为false时才检查第二个操作数 所以我想知道regexp(|)(也称为pipe)或操作符的工作方式是否相同,或者它首先匹配两个子字符串,然后决定匹配。 如果我没有错的话,我认为它应该只在左侧子字符串不匹配时检查第二个右侧子字符串,以提高性能。是的,正则表达式中的是短路 比如说, "The | is short circ
如果我没有错的话,我认为它应该只在左侧子字符串不匹配时检查第二个右侧子字符串,以提高性能。是的,正则表达式中的
是短路
比如说,
"The | is short circuiting, NOT!".match(/The \| is short circuiting(?:|, NOT!)/)
产生
["The | is short circuiting"]
["The | is not short circuiting, NOT!"]
当
产生
["The | is short circuiting"]
["The | is not short circuiting, NOT!"]
警察说
生产析取::Alternative|
析取计算如下:
b如果r未失败,则返回r.
C调用m2(x,c)并返回其结果
15.10.2.3第3b行是指定短路的地方。我确信它也以类似的方式工作……顺便说一句,它被称为短路。你有什么具体的原因想知道吗?或者这只是一个一般性的问题?@Ian:我在使用javascript regexp,当我遇到Or运算符时,我认为使用逻辑运算符实现所谓的短路非常简单,但是使用regexp,我认为实现同样的功能必须要有一定的性能或内存开销。但是请注意,在步骤
2
中,正则表达式是经过计算的,所以它不是完全短路的。@Kolink,不是。第2行仅用于将该结构解析为matcher对象。在应用匹配器之前,不会修改任何捕获组。如果没有指定正则表达式解析错误是“早期错误”,那么将第2行移到3b之后只会导致可观察的效果。您可以看到matcher 2没有被应用,因为如果它被应用,那么“abc”。match(/ab(?:(c))/)
将必须返回[“ab”,“c”]
,但它会返回[“ab”,null]
。这是正确的,但推理并非完全可靠。严格地说,你无法判断某个蹩脚的浏览器是否应用了两个匹配器,只是为了扔掉第二个匹配。我想一些性能测试可能会给出一个提示。在ES6中,应该是这样,但如果链接错误,请更正它。@社区,您在2020年编辑了这篇文章,但没有编辑到ES6
。。