尝试使用预定义的逗号分隔的单词列表构建正则表达式以进行捕获

时间:2018-02-23 22:35:12

标签: regex

我正在开发一个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的输出是相同的(出于某种原因我无法保存正则表达式链接到这里)。

1 个答案:

答案 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]

Code demo