我将退一步看大局,并针对您的问题提出以下解决方案:
System.out.println(
"012345".replaceAll("(.)(.)", "$2$1")
);
// "103254"
也就是说,给定一个String s
, s.replaceAll("(.)(.)", "$2$1"))
返回一个新字符串,其中每个相邻的字符对s
被交换。如果s
具有奇数长度,则最后一个字符保持不变。如果字符串可以包含换行符,则使用(?s)
嵌入式Pattern.DOTALL http://java.sun.com/javase/6/docs/api/java/util/regex/Pattern.html#DOTALL.
本质上,模式是..
(即“任意两个字符”),但是每个.
被括号包围以创建捕获组,以便捕获的匹配可以用于替换。
MATCH: (.)(.)
1 2
REPLACE
WITH: $2$1
在 Java 正则表达式中,例如$1
替换字符串中的内容指的是第 1 组在比赛中捕获的内容。
参考
-
Regular-Expressions.info/Dot 匹配(几乎)任何字符 http://www.regular-expressions.info/dot.html and 用于分组的括号 http://www.regular-expressions.info/brackets.html
- java.util.regex.Matcher.replaceAll http://java.sun.com/javase/6/docs/api/java/util/regex/Matcher.html#replaceAll%28java.lang.String%29
变化
提供这些是为了提供更多的指导价值:
System.out.println(
"abcdefg".replaceAll("(.)(.)", "$1[$2]")
);
// "a[b]c[d]e[f]g"
System.out.println(
"> Regular expressions: now you have two problems!"
.replaceAll("(.)(.)", "$2$1")
);
// " >eRugal rxerpseisno:sn woy uoh va ewt orpboelsm!"
System.out.println(
"> Regular expressions: now you have two problems!"
.replaceAll("(\\w)(\\w)", "$2$1")
);
// "> eRugalr xerpseisnos: onw oyu ahev wto rpboelsm!"
System.out.println(
"Wow! Really?? That's awesome!!!"
.replaceAll("(.)([!?]+)", "$1$1$1$2$2")
);
// "Wowww!! Reallyyy???? That's awesomeee!!!!!!"