可通过正则捕获组与$1、$2反向引用在replaceall中实现位置交换:如"ab"→"ba"用"(.)(.)"→"$2$1";key=value翻转用"(w+)=(w+)"→"$2=$1";首尾互换用"^(.)(.*?)(.)$"→"$3$2$1"。

可以通过正则表达式捕获组配合 $1、$2 等反向引用,在 String.replaceAll() 中实现字符或子串的位置交换,核心在于“先匹配出待交换的两部分,再按新顺序拼接”。
用两个捕获组交换相邻字符
比如把 "ab" 变成 "ba",或对字符串中所有连续的两个字母做位置翻转:
String s = "abcd";
String swapped = s.replaceAll("(.)(.)", "$2$1"); // 匹配任意两个连续字符,$1 是第一个,$2 是第二个
// 结果: "badc"(a↔b,c↔d)
说明:
- (.) 捕获第一个任意字符($1),(.) 捕获第二个($2)
- "$2$1" 表示把第二个字符放在前面,第一个放在后面
- 注意:该正则会**贪心地、从左到右逐对匹配**,不重叠(即匹配完前两个后,从第三个开始继续)
交换特定模式的两部分(如 key=value 中的 key 和 value)
例如将 "name=Tom" 转为 "Tom=name":
String s = "name=Tom&age=25";
String swapped = s.replaceAll("(\w+)=(\w+)", "$2=$1");
// 结果: "Tom=name&25=age"
关键点:
- (\w+) 匹配单词字符(字母/数字/下划线),加括号形成捕获组
- $1 对应第一个括号内容(如 "name"),$2 对应第二个(如 "Tom")
- 替换模板 "$2=$1" 实现左右调换
- 若需保留原始分隔符(如 = 或空格),直接写在替换字符串里即可
交换首尾字符(固定位置)
例如把 "hello" 变成 "oellh"(首尾互换,中间不变):
String s = "hello";
String swapped = s.replaceAll("^(.)(.*?)(.)$", "$3$2$1");
// 结果: "oellh"
解释:
- ^ 和 $ 锚定整个字符串
- (.) 捕获首字符($1)
- (.*?) 非贪婪匹配中间任意内容($2)
- (.) 捕获尾字符($3)
- "$3$2$1" 即“尾 + 中间 + 首”
注意事项与常见陷阱
⚠️ 注意以下几点,否则容易出错:
- 正则中普通括号
()才是捕获组,(?:...)是非捕获组,不会生成$1 - 反向引用写法是
$1、$2,不是或\1(那是正则内部引用,replaceAll的 replacement 字符串里必须用$) - 若字符串中没有匹配项,
replaceAll直接返回原字符串,不会报错 - 要交换的内容如果含特殊正则字符(如
.、*、$),需在 pattern 中转义(如\.),但$1中无需转义










