以下javascript表达式产生["myParameter=foobar", "foobar"]
。
'XXXXmyParameter=foobar'.match(/(?:myParameter=)([A-Za-z]+)/);
为什么"myParameter=foobar"
甚至匹配?我认为积极的外观被排除在比赛之外?
有没有办法只在JavaScript中捕获我的正则表达式的([A-Za-z]+)
部分?我可以在列表中选择第二项,但有没有办法明确地从正则表达式中的匹配中排除myParameter=
?
答案 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]+$