下面的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]+$
演示