如何删除所有重复的字符

时间:2012-07-02 10:43:31

标签: java regex

我并不喜欢使用Java工作的Regex示例来删除所有重复的字符。

此代码效果不佳:'g'和'<'被删除,超过两个字符没有明显减少到一个,'454'被减少为'5'。

s = "aa  hgjii2222 22    FFonn;;;,,1111111111 22< 454";
p = Pattern.compile("(.)(.)");
m = p.matcher(s);
System.out.println(m.replaceAll("$1") );

输出:

  

a hji222 Fon;,11111 2 5

我尝试过其他解决方案,但收效甚微。

3 个答案:

答案 0 :(得分:5)

你可以这样做:

String s= "aa  hgjii2222 22    FFonn;;;,,1111111111 22< 454";
s = s.replaceAll("(.)\\1+","$1");

使用的正则表达式是:(.)\\1+

(.)  - Matches any non-newline character and remembers it
\\1+ - One or more repetitions of the remembered character

答案 1 :(得分:2)

使用

"(.)\\1+"

代替。

第一个符号重复一次或多次。

答案 2 :(得分:0)

这种模式根本不符合你的希望。

找到任何字符,然后是任意字符(不一定与第一个字符相同),然后用第一个匹配替换这两个字符串(第一个字符)。

换句话说,它会删除所有其他角色。

我不认为正则表达式是您正在寻找的工作的正确工具;想想如何将其作为FSA来实现,并且应该清楚的是,常规语言根本不能很好地描述问题。

在代码中简单地执行此操作会更简单,也可能更清晰。保留一组到目前为止遇到的所有字符,并在迭代时删除任何匹配的字符 - 例如:

final Set<Character> charsSeen = new HashSet<Character>();
final StringBuilder out = new StringBuilder();
for (char c : s.toCharArray()) {
    if (!charsSeen.contains(c)) {
        out.append(c);
        charsSeen.add(c);
    }
}
return out.toString();