提问者:小点点

带多个字符分隔符的正则表达式


我有这根绳子

options{Red | Blue | Green}

我想一个接一个地捕捉花括号内的选项。 到目前为止我能够捕获内部部分,但是我不明白如何将模式SPACELINESPACE设置为分隔符并捕获红色,蓝色和绿色。

为了捕获花括号内的字符串,我使用了选项{(.)*}

我用以下方法捕获值时得到了一些结果:

(.+?)(?: \| |$)

但是,当我像这样编写所有内容时,options={(.+?)(?:\$)},我不会捕获任何内容


共2个答案

匿名用户

你能用像这样的东西吗:

\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