PCRE正则匹配MyFunction的平衡括号参数问题求助
MyFunction嵌套括号参数的PCRE正则匹配与替换方案
匹配并替换的正则表达式
要精准匹配MyFunction()中的参数(含嵌套括号)并替换为指定内容,可使用以下PCRE正则:
方案1(利用\K直接定位替换内容)
查找正则:
MyFunction\(\K(?:[^()]++|(\((?:[^()]++|(?1))*+\)))*+(?=\))
替换为:XXXXXX
方案2(利用捕获组)
查找正则:
(MyFunction\()(?:[^()]+|(\((?:[^()]+|(?2))*\)))*+(?=\))
替换为:$1XXXXXX
正则逻辑说明
MyFunction\(:精准匹配目标函数的开头,避免误匹配其他函数的括号结构\K(方案1专用):重置匹配起点,丢弃前面的MyFunction(,后续匹配的内容直接是需要替换的参数部分(?:[^()]++|(\((?:[^()]++|(?1))*+\)))*+:核心平衡括号匹配逻辑[^()]++:匹配任意非括号字符,使用占有量词++避免回溯,提升匹配效率(\((?:[^()]++|(?1))*+\)):子组定义,匹配一组完整的平衡括号;内部通过(?1)递归调用自身,处理多层嵌套括号*+:重复匹配上述内容,确保覆盖括号内所有参数(包括嵌套函数调用)
(?=\)):正向预查,确保匹配的内容末尾紧跟MyFunction的闭合括号,防止误匹配其他无关括号
替换效果示例
输入字符串:
logger.info("MyFunction( Encrypt('Sekret'), Date() )")
替换后结果:
logger.info("MyFunction(XXXXXX)")
原正则失效原因
你之前尝试的MyFunction\((?:[^)(]+|(?R))*+\)失效,是因为(?R)会递归整个正则表达式,即尝试匹配完整的MyFunction(...)结构,而不是单纯匹配嵌套的平衡括号。当参数中的嵌套括号内没有MyFunction时,递归逻辑无法匹配,导致整体匹配失败。改用子组递归((?1)/(?2))则只针对平衡括号部分递归,解决了这个问题。
内容的提问来源于stack exchange,提问作者user9219182
相关产品推荐
相关产品推荐

