You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写正则精准替换SQL中CASE后带非空格内容再接WHEN的片段

正则替换CASE WHEN的正确实现

问题原因

你最初的写法失效的核心原因是:正则中的.*?(非贪婪匹配)没有做范围限制,会优先匹配最长的有效命中区间,最终将最外层CASE到嵌套层WHEN之间的所有内容都纳入匹配范围,误替换了不需要修改的CASE WHEN结构。

正确正则方案

我们可以用负向预查过滤掉CASE后直接跟WHEN的场景,再配合惰性匹配保证只匹配到最近的一个WHEN就停止,正则写法如下:
通用正则(兼容所有语言,支持跨行):

CASE\s+(?!WHEN\b)[\s\S]*?\s*WHEN

各语言实现示例

  1. Java
String result = originalStr.replaceAll("CASE\\s+(?!WHEN\\b)[\\s\\S]*?\\s*WHEN", "CASE var WHEN");
  1. JavaScript
// 加s标记开启dotAll模式,允许.匹配换行符
const result = originalStr.replace(/CASE\s+(?!WHEN\b).*?\s*WHEN/sg, 'CASE var WHEN');
  1. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 21:15:03