如何编写正则精准替换SQL中CASE后带非空格内容再接WHEN的片段
正则替换CASE WHEN的正确实现
问题原因
你最初的写法失效的核心原因是:正则中的.*?(非贪婪匹配)没有做范围限制,会优先匹配最长的有效命中区间,最终将最外层CASE到嵌套层WHEN之间的所有内容都纳入匹配范围,误替换了不需要修改的CASE WHEN结构。
正确正则方案
我们可以用负向预查过滤掉CASE后直接跟WHEN的场景,再配合惰性匹配保证只匹配到最近的一个WHEN就停止,正则写法如下:
通用正则(兼容所有语言,支持跨行):
CASE\s+(?!WHEN\b)[\s\S]*?\s*WHEN
各语言实现示例
- Java
String result = originalStr.replaceAll("CASE\\s+(?!WHEN\\b)[\\s\\S]*?\\s*WHEN", "CASE var WHEN");
- JavaScript
// 加s标记开启dotAll模式,允许.匹配换行符 const result = originalStr.replace(/CASE\s+(?!WHEN\b).*?\s*WHEN/sg, 'CASE var WHEN');
- Python
import re result = re.sub(r"CASE\s+(?!WHEN\b)[\s\S]*?\s*WHEN", "CASE var WHEN", originalStr)
规则说明
\s+:匹配CASE后1个或多个空白字符(空格、换行、制表符等)(?!WHEN\b):负向预查,校验CASE后的空白字符后不能直接是WHEN(排除不需要替换的场景)[\s\S]*?:惰性匹配任意字符(包括换行),直到命中最近的WHEN停止,不会跨区间匹配\s*WHEN:匹配WHEN之前的任意空白,保证替换后格式整洁
内容的提问来源于stack exchange,提问作者Monta
相关产品推荐
相关产品推荐

