Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript regexp(|)管道操作符的工作方式是否与(| |)逻辑操作符的工作方式相同?_Javascript_Regex_Logical Operators - Fatal编程技术网

javascript regexp(|)管道操作符的工作方式是否与(| |)逻辑操作符的工作方式相同?

javascript regexp(|)管道操作符的工作方式是否与(| |)逻辑操作符的工作方式相同?,javascript,regex,logical-operators,Javascript,Regex,Logical Operators,我知道javascript中的regexp或(|)运算符匹配regexp两侧的一个子字符串 我还知道,在JavaScript中,逻辑(| |)OR运算符仅在第一个操作数为false时才检查第二个操作数 所以我想知道regexp(|)(也称为pipe)或操作符的工作方式是否相同,或者它首先匹配两个子字符串,然后决定匹配。 如果我没有错的话,我认为它应该只在左侧子字符串不匹配时检查第二个右侧子字符串,以提高性能。是的,正则表达式中的是短路 比如说, "The | is short circ

我知道javascript中的regexp或(|)运算符匹配regexp两侧的一个子字符串

我还知道,在JavaScript中,逻辑(| |)OR运算符仅在第一个操作数为false时才检查第二个操作数

所以我想知道regexp(|)(也称为pipe)或操作符的工作方式是否相同,或者它首先匹配两个子字符串,然后决定匹配。
如果我没有错的话,我认为它应该只在左侧子字符串不匹配时检查第二个右侧子字符串,以提高性能。

是的,正则表达式中的
是短路

比如说,

"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
|
析取计算如下:

  • 评估备选方案以获得匹配器m1
  • 计算析取以获得匹配器m2
  • 返回一个内部Matcher闭包,该闭包接受两个参数,即状态x和延续c,并执行以下操作: A.调用m1(x,c)并将r作为其结果。
    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
    。。