我有这根绳子
options{Red | Blue | Green}
我想一个接一个地捕捉花括号内的选项。 到目前为止我能够捕获内部部分,但是我不明白如何将模式SPACELINESPACE设置为分隔符并捕获红色,蓝色和绿色。
为了捕获花括号内的字符串,我使用了选项{(.)*}
我用以下方法捕获值时得到了一些结果:
(.+?)(?: \| |$)
但是,当我像这样编写所有内容时,options={(.+?)(?:\$)}
,我不会捕获任何内容
你能用像这样的东西吗:
\w+(?=[^{]*?})
编辑1:下面评论中提到的OP:
“如果我有这样的东西,options{Red Blue green},users={Paul Ringo John George}
,该怎么办?我只想捕获选项。”
我不确定使用的是什么口味,但是下面的模式将否定在'users'中找到的子字符串。
\busers={.*?}(*SKIP)(*F)|\w+(?=[^{]*?})
查看在线演示
编辑2:
在不知道除“用户”之外是否还有更多类别需要否定的情况下,我们可以扩展上面的模式:
(?<!\boptions){.*?}(*SKIP)(*F)|\w+(?=[^{]*?})
查看在线演示
另一种方法是使用boost和匹配子串,使用:
(?:\boptions{|\G(?!^))(?:[ |]+)?\K\w+
查看在线演示
您可以通过几个(非正则表达式)步骤来完成其余的工作:使用您的第一个正则表达式,在上拆分,然后修剪。
如果你想在正则表达式中完成所有的工作,并最终将每种颜色归到不同的组中,这可能会比较复杂,但也是可行的,我将尝试挑战。 总是有3种颜色吗? 如果是这样,那就容易多了。
编辑:仅使用正则表达式,这将使用组1中的选项执行(?!.*\{)([^}]+)
的特技
https://regex101.com/r/0zjzz8/1