【发布时间】:2017-03-23 10:37:33
【问题描述】:
我知道如何从字符串中删除重复的字符,并在没有正则表达式的情况下保留第一次出现的字符:
String method(String s){
String result = "";
for(char c : s.toCharArray()){
result += result.contains(c+"")
? ""
: c;
}
return result;
}
// Example input: "Type unique chars!"
// Output: "Type uniqchars!"
我知道如何从字符串中删除重复字符并使用正则表达式保留最后出现的字符:
String method(String s){
return s.replaceAll("(.)(?=.*\\1)", "");
}
// Example input: "Type unique chars!"
// Output: "Typnique chars!"
至于我的问题:是否可以使用正则表达式从字符串中删除重复的字符,但保留第一次出现而不是最后一次出现?
至于我为什么要问:我使用以下函数(基于上面的第一个示例)遇到了this codegolf answer:
String f(char[]s){String t="";for(char c:s)t+=t.contains(c+"")?"":c;return t;}
我想知道这是否可以通过正则表达式和字符串输入来缩短。但即使它更长,我也只是好奇是否可以使用正则表达式从字符串中删除重复的字符,同时保留每个字符的第一次出现。
【问题讨论】:
-
@WiktorStribiżew 嗯,这是一个聪明的方法。从反转的字符串开始,使用正则表达式,然后再次将其还原。我猜想使用带有字符的 for 循环会更短,但你的函数仍然是一个不错的方法。通过一些代码打高尔夫球,它是 110 个字节:
String h(StringBuffer s){return""+new StringBuffer((s.reverse()+"").replaceAll("(.)(?=.*\\1)","")).reverse();}
标签: java regex string regex-lookarounds regex-group