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

Java 8中基于正则表达式实现保留字大小写转换(含例外规则)的代码优化咨询

解决Java 8正则转换保留字的两个问题

嘿,我来帮你搞定这两个困扰你的问题!先分析下当前代码的问题所在:

问题原因

  1. 连字符后的保留字被错误转换:你用的\b是正则里的单词边界,但-属于非单词字符,所以report-id里的id前后会被\b识别为单词边界,导致被错误替换成大写。
  2. 括号内的保留字未转换:虽然理论上\b应该匹配括号里的id(因为(和)都是非单词字符),但Java的\b在某些场景下的匹配逻辑会有偏差,加上我们需要同时解决连字符的问题,所以换用更精确的断言来定义边界会更可靠。

优化后的代码

我调整了正则表达式,用负向断言来精准定义保留字的边界,同时避免连字符的干扰,还能正确匹配括号内的保留字:

import java.util.Arrays;
import java.util.regex.Pattern;

public class ReservedWordConverter {
    public static void main(String[] args) {
        String[] RESERVED_WORDS = { "id", "url" };
        String input = "id report with report-id is in the url but not in the identifier (id)";
        
        // 遍历每个保留字进行替换
        for (String word : RESERVED_WORDS) {
            // 用负向断言定义边界:前后不能是单词字符或连字符
            String regex = "(?<![\\w-])" + Pattern.quote(word) + "(?![\\w-])";
            input = input.replaceAll(regex, word.toUpperCase());
        }
        
        System.out.println(input);
        // 输出:ID report with report-id is in the URL but not in the identifier (ID)
    }
}

代码解释

  • Pattern.quote(word):这一步很重要!它会把保留字中的任何正则特殊字符(比如如果以后加了$这类)转义成普通文本,避免正则语法冲突。
  • (?<![\\w-]):负向回顾后发断言,确保保留字的前面不是字母、数字、下划线或连字符。这样就不会匹配report-id里的id(因为前面是-)。
  • (?![\\w-]):负向先行断言,确保保留字的后面不是字母、数字、下划线或连字符。既排除了连字符的干扰,也能正确匹配括号里的id(因为后面是),不属于\w或-)。

运行这段代码后,就能得到你想要的期望结果啦!

内容的提问来源于stack exchange,提问作者Despotars

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 02:48:13