jenkins pipeline re匹配 “由逗号分隔的多个键值对”

要求格式为 key: value, key: value

/^[^:,]+:\s*[^:,]+(?:\s*,\s*[^:,]+:\s*[^:,]+)*$/
def testStrings = [
    "author: tom",                          // 单个 - 通过
    "author: tom, status: active",          // 多个 - 通过
    "author: tom,status:active,id:123",     // 紧凑格式 - 通过
    "author: tom,",                         // 错误:以逗号结尾 - 失败
    "author",                               // 错误:无冒号 - 失败
    ": value"                               // 错误:无 Key - 失败
]

def regex = /^[^:,]+:\s*[^:,]+(?:\s*,\s*[^:,]+:\s*[^:,]+)*$/

script {
    testStrings.each { str ->
        if (str ==~ regex) {
            echo "【验证通过】: ${str}"
        } else {
            echo "【验证失败】: ${str}"
        }
    }
}

支持中文冒号和逗号

为了支持中文的冒号()和逗号(),我们需要在正则表达式的排除字符集分隔符匹配两个部分进行扩展。

扩展后的正则表达式

/^[^:,:,]+[::]\s*[^:,:,]+(?:\s*[,,]\s*[^:,:,]+[::]\s*[^:,:,]+)*$/

修改点详细说明

  1. 排除字符集 [^:,:,]+

    • 原本是 [^:,]+,现在增加了中文冒号 和中文逗号
    • 作用:确保在匹配“键”或“值”的过程中,一旦遇到任何形式的冒号或逗号就停止,防止跨越分隔符。
  2. 冒号匹配 [::]

    • 将原本固定的 : 改为字符集 [::]
    • 作用:兼容英文冒号和中文全角冒号。
  3. 逗号匹配 [,,]

    • 将原本固定的 , 改为字符集 [,,]
    • 作用:兼容英文逗号和中文全角逗号。

Groovy (Jenkins Pipeline) 示例代码

在 Groovy 中,你可以直接使用斜杠 /.../ 定义正则,它对中文字符有很好的支持:

// 待测试的各种混合格式
def testStrings = [
    "name: tom",                        // 纯英文格式
    "姓名:张三",                        // 纯中文格式
    "项目: Jenkins,状态:成功",          // 中英文混合:英文冒号+中文逗号+中文冒号
    "key1:value1,key2:value2,key3: v3", // 极端混合格式
    "错误格式,:",                      // 错误格式
    "姓名:",                           // 错误:缺少值
    ":张三"                            // 错误:缺少键
]

// 扩展后的正则
def regex = /^[^:,:,]+[::]\s*[^:,:,]+(?:\s*[,,]\s*[^:,:,]+[::]\s*[^:,:,]+)*$/

script {
    testStrings.each { str ->
        // 使用 ==~ 进行全字符串匹配
        if (str ==~ regex) {
            echo "【验证通过】: ${str}"
        } else {
            echo "【验证失败】: ${str}"
        }
    }
}

逻辑解析

这个正则的结构依然保持了 “首个键值对 + 0到多个后续键值对” 的逻辑:

  • ^[^:,:,]+[::]\s*[^:,:,]+
    • 匹配第一个键值对。
    • 键和值中都排除了 :,:, 这四个字符。
    • 支持中英文冒号。
  • (?:\s*[,,]\s*...)*
    • [,,] 允许使用中英文逗号作为分隔符。
    • 内部重复了相同的键值对匹配逻辑。

提示:

  • 空格处理:正则中的 \s* 只匹配了标准空白符(如空格、Tab)。中文输入法有时会产生“全角空格”,如果需要兼容全角空格,可以将 \s 替换为 [ \t\u3000](其中 \u3000 是全角空格的 Unicode)。
  • 空值允许:如果你希望允许 键:(值为空)的情况,请将值部分的 + 改为 *,即:[^:,:,]*

python re 匹配

import re
# find 'part12 mark'
text = "type #123,234, 333 this part12 mark "
text = "type #123 this part12 mark "

# 使用 search 查找
match = re.search(r"type #[\d, ]+\s+(.*)", text)
if match:
    # group(1) 获取第一个括号内匹配到的内容
    result = match.group(1)
    print(f"匹配结果: '{result}'")

# 按数字和逗号的组合进行分割
parts = re.split(r"type #[\d, ]+\s+", text)
result = parts[1] if len(parts) > 1 else ""

正则表达式详细解释:
type #:精确匹配开头的字符串。
[\d, ]+:匹配一个或多个数字 (\d)、逗号 (,) 或空格 ( )。这部分会覆盖 #123,234, 333。
\s+:匹配数字部分与目标文本之间的空格。
(.):关键部分。圆括号表示一个“捕获组”,. 代表任意字符, 代表匹配零个或多个。它会抓取剩下的所有内容。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐