Java正则表达式replaceAll匹配带双引号字符串替换失败问题排查
Java正则表达式replaceAll匹配带双引号字符串替换失败问题排查
嘿,我瞅你这问题出在正则的**单词边界\b**上啦!
咱们先拆解下你的场景:你想把min("ş".SALARY)里的"ş".SALARY替换成新的列名,但现在匹配不到对吧?
问题根源
你用了\\b来定义匹配的边界,但\b的作用是匹配「单词字符(字母、数字、下划线)」和「非单词字符」之间的分界。而你要匹配的目标字符串"ş".SALARY,开头是双引号"(属于非单词字符),它前面的字符是((也是非单词字符)——两个非单词字符之间根本不存在单词边界!这就导致你的正则表达式从一开始就匹配不上目标位置,自然替换失败了。
另外你已经用了Pattern.quote(fullName),它会把目标字符串转义成字面量匹配,不需要额外加单词边界来限定(除非你有特殊的整词匹配需求,但这里明显不需要)。
修正方案
把正则里的\\b去掉就行,修改后的代码如下:
// 目标匹配字符串 String fullName = "\"ş\".SALARY"; // 去掉\\b,直接用转义后的字面量匹配 Pattern pattern = Pattern.compile(Pattern.quote(fullName), Pattern.UNICODE_CASE); // 待处理表达式 String expressionTxt = "min(\"ş\".SALARY)"; Matcher matcher = pattern.matcher(expressionTxt); // 替换后的新列名 String newColumnName = "EM_PLOYEES_1.SALARY"; String result = matcher.replaceAll(Matcher.quoteReplacement(newColumnName)); // 输出结果就是min(EM_PLOYEES_1.SALARY) System.out.println(result);
这样修改后,正则就会精准匹配到字符串里的"ş".SALARY,替换也就正常生效啦。
备注:内容来源于stack exchange,提问作者xenitis
相关产品推荐
相关产品推荐

