我正在开发一个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的输出是相同的(出于某种原因我无法保存正则表达式链接到这里)。
答案 0 :(得分:1)
正则表达式:config(?:1[ab]|2[ab]|3[abc])(?=[,/]|$)
详细说明:
()
捕获小组(?:)
非捕获组|
或[]
匹配列表中的单个字符?
匹配0到1次Groovy代码:
def input = "test:config1a,config1b/config2a/config3a,config3c"
def configs = (input =~ /config(?:1[ab]|2[ab]|3[abc])(?=[,\/]|$)/).collect { it }
输出:
[config1a, config1b, config2a, config3a, config3c]