例如,我需要从块中获取所有(test\d+)
,以关键字start
开头,并以and
,&
,,
分隔符分隔。< / p>
bla bla start test1, test2, test3 and test4 & test12 but not test5,
test6 or test33, and start test100.
所以我应该得到test1, test2, test3, test4, test12, test100
我玩了一段时间的正则表达式,并且有一半的解决方案。 I got blocks correctly, but it extracts only one last occurance
start\s(?:(test\d+)(?:\s?(?:[,&]|and)\s?)?)+
答案 0 :(得分:2)
这不能在单个正则表达式中完成。您需要使用带有回调的Array.prototype.map()
function分两步执行此操作:
var str = 'bla bla start test1, test2, test3 and test4 & test12 but not test5, \ntest6 or test33, and start test100';
var m = str.match(/\bstart((?:\s*(?:[,&]|and)?\s*test\d+\b)+)/g).map(function(val) {
return val.match(/\btest\d+/g);
})
console.log(m[0]);
//=> ["test1", "test2", "test3", "test4", "test12"]
console.log(m[1]);
//=> ["test100"]
根据下面的评论,这里有一个PCRE正则表达式,用单正则表达式来解决它:
(?:\bstart|(?<!^)\G)\s*(?:[,&]|and)?\s*(test\d+)