JavaScript正则表达式中的(|)管道操作符和逻辑运算符(||)是否相同?

5
我知道JavaScript中的正则表达式OR(|)运算符会在正则表达式的两侧子字符串中有一个匹配时进行匹配。
我还知道在JavaScript中,逻辑(||)OR运算符仅在第一个操作数为false时才检查第二个操作数。
因此,我想知道正则表达式(|)(也称为管道)OR运算符是否以相同的方式工作,还是首先匹配两个子字符串,然后再决定匹配。 如果我没错的话,我认为它应该仅在左侧子字符串未匹配时才检查右侧第二个子字符串,以提高性能。

我相信它的工作方式类似...顺便说一下,这被称为短路。你想知道有什么具体原因吗?还是只是一般性问题? - Ian
@Ian:我正在使用JavaScript正则表达式,当我遇到OR运算符时,我认为使用逻辑运算符实现所谓的短路非常简单,但是对于正则表达式来说,我认为必须付出一些性能或内存成本才能实现相同的功能。 - me_digvijay
1个回答

8

是的,在正则表达式中,| 是短路的。

例如,

"The | is short circuiting, NOT!".match(/The \| is short circuiting(?:|, NOT!)/)

生成

["The | is short circuiting"]

当...时
"The | is not short circuiting, NOT!".match(/The \| is not short circuiting(?:, NOT!|)/)

生成

["The | is not short circuiting, NOT!"]

语言规范中指出:

产生式 Disjunction :: Alternative | Disjunction 的计算方式如下:

  1. 计算 Alternative 得到匹配器 m1。
  2. 计算 Disjunction 得到匹配器 m2。
  3. 返回一个内部匹配器闭包,它接受两个参数:状态 x 和续延 c,并执行以下操作:
    a. 调用 m1(x, c),并将其结果存储在 r 中。
    b. 如果 r 不是失败,则返回 r。
    c. 调用 m2(x, c) 并返回其结果。

15.10.2.3 行 3b 指定了短路的位置。


请注意,在第2步中,正则表达式是被评估的,因此它并不完全支持短路。 - Niet the Dark Absol
@Kolink,不是这样的。第2行只是用来将该结构解析为匹配器对象。在应用该匹配器之前,没有捕获组被修改。如果将第2行移动到3b之后,只有当第16章未指定正则表达式解析错误为“早期错误”时,才会导致可观察到的效果。您可以看到匹配器2未被应用,因为如果它被应用,则"abc".match(/ab(?:|(c))/)必须返回["ab","c"],但实际上它返回的是["ab",null] - Mike Samuel
没错,但是这个推理并不十分可靠。严格来说,你无法确定一些糟糕的浏览器是否应用了两个匹配器只是为了抛弃第二个匹配项。我想一些性能测试可能会给出一些提示。 - user123444555621
在ES6中,应该是这里,如果链接错误,请更正。 - Timo
@社区,您在2020年编辑了帖子,但没有转换为es6 - Timo

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