使用正则表达式从字符串中去除重复字符,保留第一次出现的字符。

3
我知道如何在没有正则表达式的情况下从字符串中删除重复字符并保留第一次出现的内容:
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!"

关于我的问题:是否可以使用正则表达式从字符串中删除重复字符,但保留第一次出现而不是最后一次?
我为什么要问这个问题:我遇到了这个代码高尔夫答案,使用以下函数(基于上面的第一个示例):
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();} - Kevin Cruijssen
1个回答

1

这不是最短的选项,也不仅涉及正则表达式,但仍然是一个选项。您可以在运行您的正则表达式之前反转字符串,然后将结果反转回来。

public static String g(StringBuilder s){
  return new StringBuilder(
   s.reverse().toString()
     .replaceAll("(?s)(.)(?=.*\\1)", ""))
     .reverse().toString();
}

查看在线Java演示

注意,我建议在正则表达式中添加(?s)(= Pattern.DOTALL内联修改标志),以便可以匹配任何符号,包括换行符(默认情况下,不匹配所有换行符)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接