jenkins pipeline re匹配 “由逗号分隔的多个键值对”(支持中文冒号和逗号)
·
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*[^:,:,]+)*$/
修改点详细说明
-
排除字符集
[^:,:,]+:- 原本是
[^:,]+,现在增加了中文冒号:和中文逗号,。 - 作用:确保在匹配“键”或“值”的过程中,一旦遇到任何形式的冒号或逗号就停止,防止跨越分隔符。
- 原本是
-
冒号匹配
[::]:- 将原本固定的
:改为字符集[::]。 - 作用:兼容英文冒号和中文全角冒号。
- 将原本固定的
-
逗号匹配
[,,]:- 将原本固定的
,改为字符集[,,]。 - 作用:兼容英文逗号和中文全角逗号。
- 将原本固定的
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+:匹配数字部分与目标文本之间的空格。
(.):关键部分。圆括号表示一个“捕获组”,. 代表任意字符, 代表匹配零个或多个。它会抓取剩下的所有内容。
更多推荐

所有评论(0)