java - 使用正则表达式从字符串中删除重复字符,保持第一次出现

标签 java regex string regex-lookarounds regex-group

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

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

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

最佳答案

它不是最短的选项,不仅涉及正则表达式,而且仍然是一个选项。你可以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 内联修饰符标志)添加到正则表达式中,以便 . 可以匹配 < em>任何 符号,包括换行符(. 默认不匹配所有换行符)。

关于java - 使用正则表达式从字符串中删除重复字符,保持第一次出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42973603/

相关文章:

java - 使用现有的 Singleton 对象进行 Autowiring 注入(inject)

Java:尝试使用 do-while 限制用户输入时,while 循环内出现无限循环

python - 使用 Python 3.4 将 header 添加到逗号分隔的字符串

java - 如何在rest api中编写自定义验证?

c# - 我无法思考如何在 C# 中使用正则表达式或如何解决我的问题

c++ - 如何使用boost C++解析8位十六进制数和字符串?

python - 使用 Python 计算文件中的二元组(两个单词对)

arrays - 从数组创建字符串的函数 (Mathematica)

javascript - 在 JQuery/Javascript 中获取特定符号后的数字

java - 您可以在二维数组上创建 Java 迭代器吗?