正则表达式可以选择以任何顺序匹配组

问题描述 投票:0回答:1

/(?=.*(?<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)?)/

这是演示

如有任何建议,将不胜感激。

javascript regex
1个回答
1
投票

为什么不直接使用全局标志?

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);
}

© www.soinside.com 2019 - 2024. All rights reserved.