Javascript 正在部分捕获负前瞻中的字符串
我的正则表达式:Javascript 正在部分捕获负前瞻中的字符串,javascript,regex,Javascript,Regex,我的正则表达式: /(?!#REF!)([^!,]{1,99})!/g 我的测试字符串: foo,#REF!,bar!,baz,qux! 它目前正在运行,但所需的结果仅适用于bar和qux待匹配。我使用了消极的前瞻(?!#REF!)来防止这种情况,但是REF作为匹配项[^!,]{1,99} 如何防止REF匹配-使用负前瞻是正确的方法吗?您可以使用以下正则表达式: (?<=^|,)(?!#REF!)([^!,]{1,99})! 并且通过参考1st捕获组由于您的字符串是逗号分隔的项目列表
/(?!#REF!)([^!,]{1,99})!/g
我的测试字符串:
foo,#REF!,bar!,baz,qux!
它目前正在运行,但所需的结果仅适用于bar代码>和qux代码>待匹配。我使用了消极的前瞻(?!#REF!)
来防止这种情况,但是REF正在捕获代码>作为匹配项[^!,]{1,99}
如何防止REF代码>匹配-使用负前瞻是正确的方法吗?您可以使用以下正则表达式:
(?<=^|,)(?!#REF!)([^!,]{1,99})!
并且通过参考1st
捕获组由于您的字符串是逗号分隔的项目列表,您可以使用逗号拆分字符串,删除所有空项目(如果有),仅获取以结尾的项目代码>然后删除代码>从字符串末尾开始:
var s=“foo,#REF!、bar!、baz、qux!”;
console.log(s.split(','))
.filter(布尔)//删除空项
.filter(函数(x){return x.charAt(x.length-1)==“!”&&x!==“#REF!”})//以!结束,而不是#REF!
.map(函数(y){返回y.substr(0,y.length-1)})//删除!
);代码>确保从字符串或逗号的开头开始匹配,您的值在组1中。顺便说一句,您的模式中只有一个捕获组。谢谢@WiktorStribiżew-这很有效,但它也匹配前导逗号,例如,我得到,bar代码>和,qux代码>。是,但它不会捕获它。正如我所写的,您的值在第1组中。@WiktorStribiżew-现在当然知道了。一个非正则表达式的方法是注意,JavaScript正则表达式中对lookbehinds的支持是一个非常新的发展。例如,这在当前存在的任何版本的Firefox中都不起作用。@Ry︁: 你完全正确,我已经相应地编辑了我的答案!谢谢你的反馈谢谢-我会和Wiktor一起去,但还是投了赞成票
(?:^|,)(?!#REF!)([^!,]{1,99}!)