我并不喜欢使用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
我尝试过其他解决方案,但收效甚微。
答案 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();