regex 正则表达式解析但不捕获可选的 Package 括号

6g8kf2rb  于 2023-05-30  发布在  其他
关注(0)|答案(1)|浏览(133)

注:虽然this other question可能有相同的答案,但我相信问题本身是不同的。另一个问题涉及可重新排序的可选捕获组,而这个问题涉及替代捕获组。
我想解析一个字符串,它可能包含也可能不包含围绕需要捕获的部分的 Package 括号。
例如,字符串可能看起来像这样:matchable_junk important ignoreable_junk或者像这样:matchable_junk (important) ignorable_junk
在这两种情况下,结果都应该是important,不带括号。
如果存在开始paren,则捕获应达到但不包括结束paren。
如果开始paren不存在,则捕获应该达到但不包括下一个空格。
括号必须匹配,所以我不能像这样让paren可选:/matchable_junk [(]?([^ )]+)[)]?/,因为这将匹配以下无效字符串:matchable_junk (important ignorable_junkmatchable_junk important) ignorable_junk
我提出了一个正则表达式,它可以通过使用交替(|)来实现这一点。/matchable_junk ([(]([^)]+)[)]|([^ ]*))/然而,使用该解决方案,2种不同的模式在不同的捕获组中结束。
我可以想到多个多步骤的解决方案,但有没有一种方法可以用一个正则表达式来实现这一点?
注意:为了解决这个问题,假设捕获字符串永远不会包含)本身,所以没有转义需要担心(但是如果存在括号,那么捕获字符串 * 可能 * 包含空格)
请只使用正则表达式的Javascript。

k4ymrczo

k4ymrczo1#

不知道它是否适合你在真实的文本中的需要,但对于你提供的示例文本,我认为下面的模式解决了你当前正则表达式的问题:

[\(\s]([^\)\(\s]+)[\)\s]
const regex = /[\(\s]([^\)\(\s]+)[\)\s]/g;
const occurances = [..."matchable_junk (important) important ignoreable_junk".matchAll(regex)];

console.log(occurances.map(o => o[1])); // returns ["important", "important"]

相关问题