3

我不喜欢使用 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") );

输出 :

一个 hji222 Fon;,11111 2 5

我尝试了其他不太成功的解决方案。

4

3 回答 3

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
于 2012-07-02T10:46:34.247 回答
2

利用

"(.)\\1+"

反而。

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

于 2012-07-02T10:46:35.770 回答
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();
于 2012-07-02T10:46:43.573 回答