【问题标题】:Remove duplicated characters from String using regex keeping first occurances使用正则表达式从字符串中删除重复字符,保持第一次出现
【发布时间】: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;}

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

【问题讨论】:

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


【解决方案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 内联修饰符标志),以便 . 可以匹配 any 符号,包括换行符(. 不匹配所有默认换行)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-26
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-12
    • 1970-01-01
    相关资源
    最近更新 更多