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

Java使用正则反转字符串如何保持特殊字符位置不变

问题说明

需求为实现字符串反转时保留所有特殊字符的原有位置不变,仅对字母部分做反转。
初始问题代码如下:

class der{
    public static void maxLength(String str) {
        String s = " ";
        s = str.replaceAll("[^a-z]+", " ");
        String rev = " ";
        char ch[] = s.toCharArray();
        for(int i =ch.length-1; i>=0 ; i--){
            rev = rev + ch[i];
        }
        System.out.println(rev);
    }
    public static void main(String[] args){
        String str = "a@utom!at$ion@";
        maxLength(str);
    }
}

当前代码运行输出为noi ta motu a,存在的问题是直接将非字母字符替换为空格,丢失了特殊字符和原位置的对应关系,无法直接将特殊字符回填到正确位置。

实现思路

不需要提前替换特殊字符,按两步处理即可:

  • 首先提取原字符串中所有小写字母,单独反转得到纯字母的反转结果串,维护一个指针标记当前待取用的反转字母位置
  • 遍历原字符串的每一个下标位置构建结果:
    • 如果当前位置是特殊字符(非a-z),直接将该特殊字符写入结果的对应位置
    • 如果当前位置是字母,从提前准备好的反转字母串中取当前指针指向的字母写入,指针后移一位
修正后可运行代码
class der{
    public static void reverseKeepSpecialChar(String str) {
        // 用正则提取所有纯字母内容并反转
        String letters = str.replaceAll("[^a-z]", "");
        StringBuilder reversedLetters = new StringBuilder(letters).reverse();
        int letterIndex = 0;
        
        // 逐位遍历原串拼接结果
        StringBuilder result = new StringBuilder();
        for (char c : str.toCharArray()) {
            if (c >= 'a' && c <= 'z') {
                // 当前位是字母,取用反转后的字母填充
                result.append(reversedLetters.charAt(letterIndex));
                letterIndex++;
            } else {
                // 当前位是特殊字符,直接保留原字符
                result.append(c);
            }
        }
        System.out.println(result.toString());
    }
    public static void main(String[] args){
        String str = "a@utom!at$ion@";
        reverseKeepSpecialChar(str);
    }
}

运行上述代码,传入测试用例a@utom!at$ion@时,输出结果为n@oita!mo$tua@,所有特殊字符位置和原字符串完全一致,字母部分完成反转,符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 06:06:40