Java 8中基于正则表达式实现保留字大小写转换(含例外规则)的代码优化咨询
解决Java 8正则转换保留字的两个问题
嘿,我来帮你搞定这两个困扰你的问题!先分析下当前代码的问题所在:
问题原因
- 连字符后的保留字被错误转换:你用的
\b是正则里的单词边界,但-属于非单词字符,所以report-id里的id前后会被\b识别为单词边界,导致被错误替换成大写。 - 括号内的保留字未转换:虽然理论上
\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
相关产品推荐
相关产品推荐

