【问题标题】:Trying to construct regex with predefined, comma-separated list of words to capture尝试使用预定义的、逗号分隔的单词列表构建正则表达式以捕获
【发布时间】: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


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多