使用正则表达式保留首次出现,从String中删除重复的字符

时间:2017-03-23 10:37:34

标签: java regex string regex-lookarounds regex-group

我知道如何从String中删除重复的字符并保留第一次出现而没有正则表达式:

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中删除重复的字符并使用regex保留最后一次出现:

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;}

我想知道使用正则表达式和字符串输入是否可以缩短这一点。但是,即使它更长,我只是好奇,如果可以从带有正则表达式的String中删除重复的字符,同时保留每个字符的第一次出现。

1 个答案:

答案 0 :(得分:1)

这不是最短的选项,不仅涉及正则表达式,还是一个选项。您可以在运行正则表达式之前reverse the string,然后反转结果。

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

请参阅online Java demo

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