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
相关产品推荐
相关产品推荐

