为什么在javascript中将正面的背景作为正则表达式匹配的一部分被捕获?

时间:2015-01-09 23:07:35

标签: javascript regex

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

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

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

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

3 个答案:

答案 0 :(得分:3)

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

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

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

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

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

答案 1 :(得分:2)

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

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

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

注意: JavaScript中不支持Lookbehind断言...

答案 2 :(得分:1)

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

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

非捕获组:

(?:myParameter=)

积极前瞻:

(?=myParameter=)

否定前瞻:

(?!myParameter=)

你需要的正则表达式是:

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

DEMO