如何将字符串中单引号外的内容转为大写并去除多余空格?
解决方案
核心思路是区分单引号内部和外部的内容分别处理:单引号内的文本完全保留原样,单引号外的文本先移除多余空格,再转为大写。
Java 实现代码
public class StringTransformer { public static void main(String[] args) { String original = "Rule2 = if(event = 'Veteran''s Day', 'Day 1', 'Day 2', Measure1.Lag)"; StringBuilder result = new StringBuilder(); // 正则匹配:要么是单引号包裹的内容(含转义的双单引号),要么是非单引号内容 java.util.regex.Pattern pattern = java.util.regex.Pattern.compile("('(?:''|[^'])*')|([^']+)"); java.util.regex.Matcher matcher = pattern.matcher(original); while (matcher.find()) { if (matcher.group(1) != null) { // 单引号内的内容直接追加 result.append(matcher.group(1)); } else { // 单引号外的内容:按需求移除多余空格后转大写 String part = matcher.group(2) .replaceAll("\\s*=\\s*", "=") .replaceAll("\\s*\\(\\s*", "(") .replaceAll("\\s*,\\s*'", ",'") .replaceAll(",\\s+", ", ") .toUpperCase(); result.append(part); } } System.out.println("myString = \"" + result.toString() + "\""); } }
细节说明
- 正则表达式解析:
('(?:''|[^'])*')|([^']+)'(?:''|[^'])*':精准匹配单引号包裹的内容,支持内部的双单引号(转义写法),比如'Veteran''s Day'会被完整保留。([^']+):匹配所有不在单引号内的文本片段。
- 空格处理逻辑:
- 移除
=两边的所有空格,转为RULE2=、EVENT=的形式; - 移除
(前后的空格,转为IF(的形式; - 移除逗号与单引号之间的空格,转为
,'Day 1'的形式; - 保留逗号与标识符之间的单个空格,转为
, MEASURE1.LAG的形式; - 最后将所有单引号外的文本转为大写。
- 移除
运行代码后会得到与你示例完全一致的输出:
myString = "RULE2=IF(EVENT='Veteran''s Day','Day 1','Day 2', MEASURE1.LAG)"
内容的提问来源于stack exchange,提问作者5122014009
相关产品推荐
相关产品推荐

