正则表达式匹配两个连续的字符,除非后面跟着/前面有更多相同的字符

Kau*_*hik 2 java regex

我有一个看起来像这样的字符串:qqq Eqq Eqqq Cqq Eqq Fq.我想用一个替换所有有两个连续字符的序列(在这种情况下qq),h所需的输出如下所示:qqq Eh Eqqq Ch Eh Fq

但是,我不希望正则表达式匹配超过两个q(qqqqqqq)的序列,并使字符串看起来像这样:hq Eh Ehq Ch Eh Fq.我已经尝试了以下但是这导致了我不想要的输出.

text = "qqq Eqq Eqqq Cqq Eqq Fq";
text = text.replaceAll("[q]{2}", "h");
Run Code Online (Sandbox Code Playgroud)

我也尝试过只替换q's后跟一个空白字符,但这最终会匹配q每个单词中的最后两个字符.有没有办法替换两个连续的字符,除非后面跟着同一个字符的第三个或第四个字符?如果有帮助,语言是Java.

Wik*_*żew 5

您可以使用基于环视的正则表达式:

String text = "qqq Eqq Eqqq Cqq Eqq Fq";
text = text.replaceAll("(?<!q)q{2}", "h");
System.out.println(text);
// => hq Eh Ehq Ch Eh Fq
Run Code Online (Sandbox Code Playgroud)

请参阅Java演示正则表达式演示.

细节

  • (?<!q)- 如果q当前位置的左侧立即存在,则会导致匹配失败的负面观察
  • q{2}- 2个q字符.

注意:如果您计划仅替换q未被qs 包围的2个字符,请(?!q)在末尾添加否定前瞻,"(?<!q)q{2}(?!q)".