【问题标题】:Excluding duplicates from a string in results从结果中的字符串中排除重复项
【发布时间】:2020-05-31 00:54:35
【问题描述】:

我正在尝试修改此正则表达式,使其不匹配重复项。

当前正则表达式

[\""].+?[\""]|[^ ]+

示例字符串

".doc" "test.xls", ".doc","me.pdf", "test file.doc"

预期结果

".doc"
"test.xls"
"me.pdf"

但不是

".doc"
"test.xls"
".doc"
"me.pdf"

注意

  1. 文件名可能包含空格,例如test file.doc
  2. 项目可以用空格或逗号或两者分隔
  3. 字符串可以有引号或没有引号,例如.doc".doc"

【问题讨论】:

  • 文件名可以有空格吗?试试("[^"\s]+")(?!.*\1)regex101.com/r/qBhkPM/1
  • 您在 RegexBuddy 中选择了哪种语言?您想在哪种工具或语言中使用该模式?
  • 请注意是否支持环视,但可能是(?<!\S)("[^"]+"|[^\s"]+)(?=(?:,? |$))(?!.* \1)regex101.com/r/AogrRL/1
  • 恕我直言正则表达式是错误的工具。您应该使用解析器。
  • 你应该马上提到,它是 C# (.Net),然后你会得到更准确的答案!

标签: c# .net regex vb.net capturing-group


【解决方案1】:

在 C# 中,您可以使用简单的正则表达式提取所有有效匹配项,并使用 .Distinct() 仅保留唯一值。

正则表达式很简单:

"(?<ext>[^"]+)"|(?<ext>[^\s,]+)

查看regex demo,您只需要组“ext”值。

详情

  • "(?&lt;ext&gt;[^"]+)" - ",(组“ext”)除"" 之外的任何1+ 个字符
  • | - 或
  • (?&lt;ext&gt;[^\s,]+) - (group "ext") 1+ 字符而不是空格和逗号

C# codesn-p:

var text = "\".doc\" \"test.xls\", \".doc\",\"me.pdf\", \"test file.doc\".doc \".doc\"";
Console.WriteLine(text); // => ".doc" "test.xls", ".doc","me.pdf", "test file.doc".doc ".doc"
var pattern = "\"(?<ext>[^\"]+)\"|(?<ext>[^\\s,]+)";
var results = Regex.Matches(text, pattern)
        .Cast<Match>()
        .Select(x => x.Groups["ext"].Value)
        .Distinct();
Console.WriteLine(string.Join("\n", results));

输出:

.doc
test.xls
me.pdf
test file.doc

【讨论】:

    猜你喜欢
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-03
    • 1970-01-01
    • 2019-05-12
    • 1970-01-01
    相关资源
    最近更新 更多