我需要使用java中的regex操作从字符串中删除一个双字母。 例如:PRINCEE - >王子 APPLE - > APLE
答案 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");
有关其他参考:
Character.isLetter(ch)
(javadocs)Character
中的任何方法
表格Character.isXyz(char)
启用名为的模式
\p{javaXyz}
(请注意
大小写)。这个机制是
described in the Pattern
javadocs \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();