如何通过正则表达式匹配完整的process代码块内容?
匹配嵌套大括号的process代码块解决方案
要匹配每个process开头的完整代码块(包含嵌套大括号),核心是处理嵌套的大括号结构,不能简单依赖贪婪匹配(会因为中间的闭合大括号提前终止)。以下分不同正则引擎给出解决方案:
支持递归匹配的引擎(PCRE、PHP、Python regex库等)
使用递归正则来处理任意层级的嵌套大括号,正则表达式如下:
^process \w+ \{((?:[^{}]|(?R)))*\}
配合**多行模式(m修饰符)**使用,让^匹配每行的开头。
正则说明:
^process \w+ \{:精准匹配行首的process声明行(如process ADT {)((?:[^{}]|(?R)))*:非捕获组,匹配两种内容:[^{}]:任何非大括号的字符(?R):递归匹配整个正则模式,处理嵌套的大括号结构
\}:匹配当前process块的最外层闭合大括号
Python示例(需安装regex库)
import regex target_text = """process ADT { { DOMAINNAME localdomain } { EODEFAULT {} } { EOXLATE {} } { XLATESTARTMODE 0 } } process ORU { { DOMAINNAME localdomain } { EODEFAULT {} } { EOXLATE {} } { SMATCYCLESIZE 100 } { TRACINGDEFAULT 0 } { XLATE { { XLATESTARTMODE 0 } } """ # 匹配所有完整process块 pattern = r'^process \w+ \{((?:[^{}]|(?R)))*\}' for match in regex.finditer(pattern, target_text, flags=regex.MULTILINE): print("匹配结果:") print(match.group(0))
JavaScript环境(无原生递归支持)
JavaScript不支持(?R)递归语法,可使用多层嵌套的分组模拟有限层级的大括号匹配,正则如下(支持3层嵌套,可按需扩展):
/^process \w+ \{((?:[^{}]|{(?:[^{}]|{(?:[^{}]|{[^{}]*})*})*})*)\}/gm
同样开启多行模式(m修饰符)和全局匹配(g修饰符)。
说明
该正则通过嵌套分组处理层级大括号,若你的代码块嵌套层级更深,可继续扩展嵌套的{(?:[^{}]|...)*}结构。
验证结果
使用上述正则可精准匹配到你期望的两个完整代码块:
- 匹配1:
process ADT { ... }的全部内容 - 匹配2:
process ORU { ... }的全部内容(包含内部嵌套的XLATE块)
内容的提问来源于stack exchange,提问作者Tobias G.
相关产品推荐
相关产品推荐

