如何编写正则表达式以匹配包含前置标识词的Jenkins Pipeline命令式与声明式代码块
解决Jenkins Pipeline代码块的正则匹配问题
我来帮你调整正则表达式,让它能精准匹配带node、pipeline这类前置标识词的完整Jenkins Pipeline代码块,不管是命令式还是声明式的都能搞定!
问题分析
你原来的正则只能匹配独立的花括号内容,没法关联前面的标识词。我们需要把标识词和后续的嵌套花括号块绑定起来,同时还要正确处理多层嵌套的花括号结构(比如Pipeline里嵌套的stage、steps块)。
修改后的正则表达式
import regex pattern = regex.compile(r'(node|pipeline)\s*(\{(?:[^{}]|(?2))*\})', regex.DOTALL)
正则各部分解释
(node|pipeline):匹配你需要捕获的前置标识词,你可以根据需求扩展这个列表(比如加上stage、timeout等)\s*:匹配标识词和左花括号之间的任意空白字符(空格、换行、制表符都算),兼容不同的代码格式化风格(\{(?:[^{}]|(?2))*\}):核心的嵌套花括号匹配逻辑,(?2)引用第二个捕获组的正则规则,确保能正确识别多层嵌套的花括号,不会提前终止匹配regex.DOTALL:让正则中的通配符能匹配换行符,这样即使代码块跨多行也能完整捕获
测试示例
用你的Jenkins Pipeline代码来测试一下:
import regex # 你的混合Pipeline代码 pipeline_code = """node { timeout(unit: 'SECONDS', time: 5) { stage("One"){ sleep 10 echo 'hello' } } } pipeline { agent any parameters { choice( description: 'Run flyway database migration using latest master branch from prices in what environment?', name: 'environment', choices: ['PRE', 'PRO'] ) } stages { stage("Wat") { steps { echo "selectedEnvironment: ${params.environment}" } } } }""" # 编译正则并查找匹配 pattern = regex.compile(r'(node|pipeline)\s*(\{(?:[^{}]|(?2))*\})', regex.DOTALL) matched_blocks = pattern.findall(pipeline_code) # 输出匹配结果 for idx, (keyword, block) in enumerate(matched_blocks, 1): full_code_block = f"{keyword}{block}" print(f"匹配到的代码块 #{idx}:\n{full_code_block}\n")
运行这段代码后,会输出两个完整的代码块:
- 命令式的
node块 - 声明式的
pipeline块
内容的提问来源于stack exchange,提问作者zxar zxar
相关产品推荐
相关产品推荐

