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

时间:2011-01-18 14:10:12

标签: java regex string

我需要使用java中的regex操作从字符串中删除一个双字母。 例如:PRINCEE - >王子     APPLE - > APLE

4 个答案:

答案 0 :(得分:13)

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

像这样:

final String str = "APPLEE";
String replaced = str.replaceAll("(.)\\1", "$1");
System.out.println(replaced);

输出:

  

APLE

不仅仅是任何字符,仅限字母

正如@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");

参考文献:

有关其他参考:

  1. Character.isLetter(ch)(javadocs)
  2. Character中的任何方法 表格Character.isXyz(char) 启用名为的模式 \p{javaXyz}(请注意 大小写)。这个机制是 described in the Pattern javadocs
  3. Unicode块和类别可以 也可以与\p和。{ \P构造如Perl。 \p{prop} 匹配,如果输入有 属性道具,而\P{prop}确实如此 如果输入有,则不匹配 属性。这种机制是also described in the Pattern javadocs

答案 1 :(得分:6)

String s = "...";
String replaced = s.replaceAll( "([A-Z])\\1", "$1" );

答案 2 :(得分:3)

如果您只想更换副本(“AA” - >“A”,“AAA” - >“AA”),请使用

public String undup(String str) {
  return str.replaceAll("(\\w)\\1", "$1");
}

要替换一式三份,请使用:str.replaceAll("(\\w)\\1+", "$1");

要仅替换单个欺骗,请使用长字符串(AAAA-> AAA,AAA-> AA):str.replaceAll("(\\w)(\\1+)", "$2");

答案 3 :(得分:1)

这可以通过遍历String而不必诉诸正则表达式来完成。

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();