/(?=.*(?<one>foo))(?=.*(?<two>bar))(?=.*(?<three>baz))/
按照本文中的模式,我尝试创建一个正则表达式,以任意顺序捕获一些组。但是,附加要求是组必须是可选的,即它必须匹配以下所有字符串:
foo bar baz
foo baz bar
baz bar foo
foo bar
foo baz
bar baz
foo
bar
baz
我尝试将量词
?
应用于捕获组,但由于某种原因它完全停止捕获该组。我想知道这是否可能?
/(?=.*(?<one>foo)?)(?=.*(?<two>bar)?)(?=.*(?<three>baz)?)/
这是演示。
如有任何建议,将不胜感激。
为什么不直接使用全局标志?
const arr = `foo bar baz
foo baz bar
baz bar foo
foo bar
foo baz
bar baz
foo
bar
baz`.split('\n');
for(const str of arr){
const result = [...str.matchAll(/(?<one>foo)|(?<two>baz)|(?<three>bar)/g)]
.reduce((r, m) => (Object.entries(m.groups).forEach(([name, val]) => val && (r[name]=val)), r), {});
console.log(result);
}