Java中如何用String.replaceAll(regex, regex)实现单行双向字符替换
实现Java中字符的双向互换(1↔N)
要解决这个双向替换的问题,直接连续调用两次replaceAll会踩坑——比如先把1换成N,再把N换成1时,刚替换出来的N也会被改成1,最终结果全变成1,完全不符合预期。
这里给你两种简洁的实现方式,都能一行代码搞定需求:
方法1:临时占位符过渡(简单直观)
用一个原始字符串中不存在的临时字符做中转,避免替换冲突:
String result = input.replaceAll("1", "#").replaceAll("N", "1").replaceAll("#", "N");
拿你要的输出N01N01举例,假设输入是10N10N,执行流程是:
- 把所有
1替换为#→"#0N#0N" - 把所有
N替换为1→"#01#01" - 把所有
#替换为N→"N01N01"(完美得到目标结果)
注意:要确保临时字符#在你的输入字符串中不存在,要是有冲突,换成\u0000(空字符)或者业务中不会出现的特殊字符就行。
方法2:Matcher自定义替换(更灵活)
如果不想依赖临时字符,可以借助Pattern和Matcher的lambda替换逻辑:
String result = Pattern.compile("[1N]").matcher(input).replaceAll(match -> match.group().equals("1") ? "N" : "1");
这个方法的逻辑很清晰:
- 用正则
[1N]匹配所有1或N字符 - 对每个匹配到的字符,通过lambda判断:是
1就换成N,是N就换成1 - 全程无临时字符干扰,适配更复杂的输入场景
两种方法都能实现你要的双向替换,根据输入字符的范围选择就行——输入字符明确无特殊符号选方法1,输入可能包含各种字符选方法2更稳妥。
内容的提问来源于stack exchange,提问作者Aristos Georgiou
相关产品推荐
相关产品推荐

