为什么在 javascript 中将正面回溯捕获为正则表达式匹配的一部分

Why are positive lookbehinds captured as part of regex matches in javascript?

本文关键字:正则表达式 一部分 回溯 javascript 为什么      更新时间:2023-09-26

下面的javascript表达式产生["myParameter=foobar", "foobar"]

'XXXXmyParameter=foobar'.match(/(?:myParameter=)([A-Za-z]+)/);

为什么"myParameter=foobar"甚至匹配?我以为积极的回头球被排除在比赛之外?

有没有办法在 javascript 中只捕获正则表达式的([A-Za-z]+)部分?我可以只选择列表中的第二项,但是有没有办法从正则表达式中的匹配项中明确排除myParameter=

(?:myParameter=)是一个非捕获组,而不是一个回头看。JavaScript 不支持 lookbehinds。

结果的第一个元素始终是完全匹配。捕获组的值是数组的第二个元素,"foobar"

如果您使用了捕获组,即 (myParameter=),结果将是:

["myParameter=foobar", "myParameter=", "foobar"]

所以同样,第一个元素是完全匹配的,每个其他元素对应于一个捕获组。

您没有实现 Positive Lookback,(?:...)语法称为非捕获组,用于对表达式进行分组,而不是捕获它们(通常在具有一组不同模式时交替使用)。

您可以简单地引用捕获的组以获取匹配结果。

var r = 'XXXXmyParameter=foobar'.match(/myParameter=([A-Za-z]+)/)[1];
if (r)
    console.log(r); //=> "foobar"

注意:JavaScript 不支持后瞻断言...

myParameter 是匹配项,因为您使用的是非捕获组。

非捕获组与文本匹配,但不能反向引用。

非捕获组:

(?:myParameter=)

积极的展望:

(?=myParameter=)

负面展望:

(?!myParameter=)

您需要的正则表达式是:

(?!myParameter=)[A-Za-z]+$

演示