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

Java中替换字符串指定位置单个反斜杠(排除Unicode转义)

替换字符串中的单个反斜杠(排除Unicode转义序列)

需求

在Java中将字符串里的单个反斜杠替换为双反斜杠,但如果该反斜杠属于\uXXXX格式的Unicode转义序列(比如字符串中的\u1234),则不进行替换。

期望替换结果:

"Muir-Torr \\ \u00E9 syndrome \\u1234 skd just some \\uabcd arbitrary text \\ s"

原代码问题分析

你提供的代码存在以下问题:

  1. 手动遍历反斜杠位置时,因Java字符串不可变,替换后长度变化会导致后续索引偏移,无法正确匹配位置。
  2. 判断Unicode转义的正则表达式逻辑错误,无法准确识别\uXXXX格式的序列。
  3. 未实现实际的替换逻辑,仅打印原字符串。

解决方案:使用正则负向预查一次性替换

利用正则表达式的负向预查功能,精准匹配那些不属于Unicode转义开头的反斜杠,一次性完成替换,避免手动遍历的问题。

修正后的代码

public class BackslashReplacer {
    public static void main(String[] args) {
        // 原字符串:Java中用\\表示单个反斜杠,\u00E9会直接编译为字符é
        String originalStr = "Muir-Torr \\ \u00E9 syndrome \\u1234 skd just some \\uabcd arbitrary text \\ s";
        System.out.println("原字符串: " + originalStr);

        // 正则规则:匹配反斜杠,且该反斜杠后不紧跟u+4位十六进制字符
        // 注意:Java中反斜杠需要双重转义,所以正则里的\\实际表示一个\
        String regex = "\\\\(?!u[0-9a-fA-F]{4})";
        // 替换为双反斜杠,同样需要双重转义,\\\\表示实际的\\
        String replacedStr = originalStr.replaceAll(regex, "\\\\\\\\");

        System.out.println("替换后字符串: " + replacedStr);
    }
}

正则说明

\\\\(?!u[0-9a-fA-F]{4}) 拆解:

  • \\\\:匹配单个反斜杠(Java字符串中需双重转义)。
  • (?!u[0-9a-fA-F]{4}):负向预查,确保当前反斜杠后面没有紧跟u和4位十六进制字符(0-9、a-f、A-F),这样就排除了\uXXXX格式的Unicode转义序列。

输出说明

控制台打印时,字符串中的\\\\会显示为\\,完全符合你的期望结果。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 21:30:54