java正则表达式,去除字符串中的相同字符,只留一个.

nixzhaihaome 2007-11-05 10:25:34
比如:
String a = "abcccccci!ppppc";
过滤后应该为:abci!p
...全文
1145 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
nixzhaihaome 2007-11-08
  • 打赏
  • 举报
回复
怎么给分和结贴啊.
nixzhaihaome 2007-11-08
  • 打赏
  • 举报
回复

//改了一下火龙果的代码,可以了
public class TruncateSameStringWithRegex {

public static void main(String[] args) throws Exception {
String str = "ab890f4f";
str = truncateString(str);
System.out.println(str);
}

private static String truncateString(String str) {
// 这一句可以减少循环的次数
// 这一句也可以改为 tmp = a.replaceAll("(.)(.*)\\1", "$1$2");
// 这样会增加循环的次数
String tmp = str.replaceAll("(.)\\1+", "$1");
str = str +" ";
int k = 0;
while (!str.equals(tmp)) {
str = tmp;
tmp = str.replaceAll("(.)(.*)\\1", "$1$2");
k++;
}
return str.substring(0,str.length());
}

}
jjmmma 2007-11-07
  • 打赏
  • 举报
回复
import java.util.*;

public class Filter
{
public static void main(String[] args)
{
String a = "abcccccci!ppppc";
Set<String> s = new HashSet<String>();
StringBuffer buf = new StringBuffer();
for (int i=0; i<a.length();i++) {
String c = a.substring(i,i+1);
if (s.contains(c)) {
continue;
}
s.add(c);
buf.append(c);
}
System.out.println(buf);
}
}
  • 打赏
  • 举报
回复
重新写了一个,要进行多次替换才能做到。

public class PatternTest {
public static void main(String[] args) {
String a = "abdcdddddcaaaeaaecdeafeaccefa";
// 这一句可以减少循环的次数
// 这一句也可以改为 tmp = a.replaceAll("(.)(.*)\\1", "$1$2");
// 这样会增加循环的次数
String tmp = a.replaceAll("(.)\\1+", "$1");
int k = 0;
while(!a.equals(tmp)) {
a = tmp;
tmp = a.replaceAll("(.)(.*)\\1", "$1$2");
k++;
}
System.out.println(a);
System.out.println(k);
}
}


为了将 abdcdddddcaaaeaaecdeafeaccefa 变为 abdcef 需要进行 11 次替换操作!

我实在想不出其他的办法了。
  • 打赏
  • 举报
回复
我理解错了,我还以为是连续两个相同的字母只留一个呢。

实际上是所有的字符中相同的只留一个!这个正则表达式恐怕做不到了吧,等待高人的回复。
dracularking 2007-11-06
  • 打赏
  • 举报
回复
interesting, mark
nixzhaihaome 2007-11-06
  • 打赏
  • 举报
回复
why
nixzhaihaome 2007-11-06
  • 打赏
  • 举报
回复
比如:
String a = "abcccccci!ppppc ";
过滤后应该为:abci!p
----------------------
不对吧,过滤后应该是:abci!pc <--- 你漏了一个“c” o(∩_∩)o

_______________________________________________________
就是要过滤后面的那个"c"啊.
nixzhaihaome 2007-11-06
  • 打赏
  • 举报
回复
比如:String a = "abdcddddd";这个字符串,上面的方法过滤不了
nixzhaihaome 2007-11-06
  • 打赏
  • 举报
回复
上面的方法只能过滤连接在一起的相同字符,如果两个不同的字符分开了,则不能达到过滤的目的.
  • 打赏
  • 举报
回复
改成这样更好一点:

public class RegExprTest {
public static void main(String[] args) {
String a = "abcccccci!ppppc";
a = a.replaceAll("(.)\\1+", "$1");
System.out.println(a);
}
}
  • 打赏
  • 举报
回复
比如:
String a = "abcccccci!ppppc";
过滤后应该为:abci!p
----------------------
不对吧,过滤后应该是:abci!pc <--- 你漏了一个“c” o(∩_∩)o
  • 打赏
  • 举报
回复
public class RegExprTest {
public static void main(String[] args) {
String a = "abcccccci!ppppc";
a = a.replaceAll("([a-z!])\\1+", "$1");
System.out.println(a);
}
}
nixzhaihaome 2007-11-06
  • 打赏
  • 举报
回复
其他的方法,已经实现了啊.就是用正则弄不出来.
  • 打赏
  • 举报
回复
嗯,好像是的,看样子这样的需求正则表达式做不到~~~~
nixzhaihaome 2007-11-06
  • 打赏
  • 举报
回复
无解
这种字符:String a = "abcdefghijklmnmnmnmnmnm";交叉重复是无法过滤的
宋玮-深圳 2007-11-05
  • 打赏
  • 举报
回复
正则不好弄吧?
不如 循环charAt(i) {然后判断后面的是否连续 等于charAt(i) }

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧