【发布时间】:2018-02-23 22:35:11
【问题描述】:
我正在生成一个 Groovy 脚本来解析我想要捕获每个单词的配置字符串(对于 GitHub 挂钩和 Jenkins 脚本的组合)。我想解析如下所示的字符串:
test:config1a,config1b/config2a/config3a,config3c
如果我放弃使用逗号分隔列表的功能,我可以使用如下所示的正则表达式来处理它:
configs = input_string =~ /^test:(config1a|config1b)\/(config2a|config2b)\/(config3a|config3b|config3c)/
但是,为任何单独的配置添加使用逗号分隔的字符串的功能会引发麻烦。我可以让它匹配,但我无法得到值列表:
configs = input_string =~ /^test:((config1a|config1b),?)+\/((config2a|config2b),?)+\/((config3a|config3b|config3c),?)+/
上述字符串的输出将是:
[test:config1a,config1b/config2a/config3a,config3c, config1b, config1b, config2a, config3c, config3c]
如果我把它放在 regex101.com 中,没有 Groovy 的输出是一样的(由于某种原因,我无法将正则表达式保存到此处链接)。
【问题讨论】:
-
为什么必须是正则表达式?
"test:config1a,config1b/config2a/config3a,config3c".split(":")[1].split("/").collect{it.split(",")}有什么问题,它似乎直接给你字符串的“解析”表示,没有任何正则表达式? -
我想这是真的。我确实必须有一个正则表达式来验证字符串,但构造它并不难。我已经想出了一种方法来获得我想要的东西,但是正则表达式变得越来越荒谬。你的想法可能没问题。
-
为什么不直接使用
config(?:1[ab]|2[ab]|3[abc])和全局标志?
标签: regex