用于仅查找字符串中的单个字母并忽略连续双字母的正则表达式

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)

anu*_*ava 4

您可以使用此正则表达式进行匹配:

((.)\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)