使用java从字符串中删除双字母

sar*_*nya 5 java regex string

我需要在java中使用正则表达式操作从字符串中删除一个双字母.例如:PRINCEE - > PRINCE APPLE - > APLE

Sea*_*oyd 13

简单解决方案(删除重复字符)

像这样:

final String str = "APPLEE";
String replaced = str.replaceAll("(.)\\1", "$1");
System.out.println(replaced);
Run Code Online (Sandbox Code Playgroud)

输出:

APLE

不只是任何Chracters,Letters

正如@Jim正确评论,上面匹配任何双字符,而不仅仅是字母.以下是一些只与字母匹配的变体:

// the basics, ASCII letters. these two are equivalent:
str.replaceAll("([A-Za-z])\\1", "$1");
str.replaceAll("(\\p{Alpha})\\1", "$1");

// Unicode Letters
str.replaceAll("(\\p{L})\\1", "$1");

// anything where Character.isLetter(ch) returns true
str.replaceAll("(\\p{javaLetter})\\1", "$1");
Run Code Online (Sandbox Code Playgroud)

参考文献:

供其他参考:

  1. Character.isLetter(ch) (Javadoc中)
  2. Character表单中的任何方法都Character.isXyz(char) 可以使用一个名为 \p{javaXyz}(大写字母)的模式.Pattern javadocs中描述了这种机制
  3. Unicode块和类别也可以与Perl中的\p\P构造匹配.\p{prop} 如果输入具有属性prop,则\P{prop}匹配,而如果输入具有该属性则匹配.Pattern javadocs中也描述了这种机制


biz*_*lop 6

String s = "...";
String replaced = s.replaceAll( "([A-Z])\\1", "$1" );
Run Code Online (Sandbox Code Playgroud)


MAK*_*MAK 1

这可以简单地通过迭代字符串来完成,而不必求助于正则表达式。

StringBuilder ret=new StringBuilder(text.length());

if (text.length()==0) return "";
ret.append(text.charAt(0));
for(int i=1;i<text.length();i++){
  if (text.charAt(i)!=text.charAt(i-1))
    ret.append(text.charAt(i));
}

return ret.toString();
Run Code Online (Sandbox Code Playgroud)