Eat*_*haq 6 java regex string duplicates
我已经搜索了很多,但我找不到一个只能选择单个字母并将其加倍的正则表达式,而那些已经是双倍的字母应该保持不变。
我试过
String str = "yahoo";
str = str.replaceAll("(\\w)\\1+", "$0$0");
Run Code Online (Sandbox Code Playgroud)
但由于这(\\w)\\1+选择了所有双元素,因此我的输出变为yahoooo. 我尝试向其添加否定!(\\w)\\1+,但没有成功,输出变得与输入相同。我努力了
str.replaceAll(".", "$0$0");
Run Code Online (Sandbox Code Playgroud)
但这会使每个字符加倍,包括已经加倍的字符。
请帮助编写一个regex可以用双字符替换所有单字符的文件,而双字符应保持不变。
abc -> aabbcc
yahoo -> yyaahhoo (o should remain untouched)
opinion -> ooppiinniioonn
aaaaaabc -> aaaaaabbcc
Run Code Online (Sandbox Code Playgroud)
您可以使用此正则表达式进行匹配:
((.)\2+)|(.)
Run Code Online (Sandbox Code Playgroud)
并将其替换为:
$1$3$3
Run Code Online (Sandbox Code Playgroud)
正则表达式解释:
((.)\2+):匹配一个字符并在第 2 组中进行捕获,并\2+在其旁边使用以确保我们匹配捕获的字符的所有多次重复。捕获第 1 组中的所有重复字符|: 或者(.):匹配任何字符并捕获第 3 组中的字符import java.util.List;
class Ideone {
public static void main(String[] args) {
List<String> input = List.of("aaa", "abc", "yahoo",
"opinion", "aaaaaabc");
for (String s: input) {
System.out.println( s + " => " +
s.replaceAll("((.)\\2+)|(.)", "$1$3$3") );
}
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
$1$3$3
Run Code Online (Sandbox Code Playgroud)