获取仅以关键字开头并以分隔符列表分隔的出现事件列表

时间:2016-03-31 06:33:58

标签: javascript regex

任务

例如,我需要从块中获取所有(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?)?)+

1 个答案:

答案 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+)

RegEx Demo