【问题标题】:Convert regex matches to the list of strings将正则表达式匹配转换为字符串列表
【发布时间】:2025-12-09 22:40:01
【问题描述】:

我正在尝试在大约 50 000 个字符串的大列表中找到相等的子字符串,这样很好:

var results = myList.FindAll(delegate (string s) { return s.Contains(myString); });

但它也会查找包含部分单词的子字符串,例如,如果我正在查找“you do”,它还会发现额外的“you dont”,因为包含“you do..”。

所以,this answer to my previous question 应该可以按我的需要工作,但我不确定如何从特定代码的正则表达式匹配中获取字符串列表:

foreach (string phrase in matchWordsList)
{
     foreach (string str in bigList)
     {
          string[] stringsToTest = new[] { phrase };
          var escapedStrings = stringsToTest.Select(s => Regex.Escape(s)); 
          var regex = new Regex("\\b(" + string.Join("|", escapedStrings) + ")\\b");
          var matches = regex.Matches(str);

          foreach (string result in matches) /// Incorrect: System.InvalidCastException 
          {
              resultsList.Add(result);
          }
     }
}

matches直接获取字符串到list会抛出异常:

发生了“System.InvalidCastException”类型的未处理异常 在test.exe中

附加信息:无法转换类型的对象 'System.Text.RegularExpressions.Match' 输入 'System.String'。

所以,我想弄清楚,热转换var matches = regex.Matches(str); 到列表

【问题讨论】:

  • 列表应该包含什么?
  • @John resultsList 必须为matchWordsList 的每个短语的每个bigList 字符串添加matches 的结果
  • 这是错误的:foreach(字符串结果匹配)。 Matches 返回 MatchCollection 而不是字符串。我总是告诉人们只在必要时使用 var。你应该使用:MatchCollection matches = regex.Matches(input, pattern);然后编译器会发现错误而不是得到运行时错误。

标签: c# regex linq substring contains


【解决方案1】:

你可以用 linq 做到这一点。但是,您需要先Cast 然后Select

var resultsList = regex.Matches(str)
                       .Cast<Match>()
                       .Select(m => m.Value)
                       .ToList();

someList.AddRange(
   regex.Matches(str)
         .Cast<Match>()
         .Select(m => m.Value));

【讨论】:

    【解决方案2】:

    只需使用Match 输入foreach 循环:

    foreach (Match result in matches)
    {
        resultsList.Add(result.Value);
    }
    

    【讨论】:

      【解决方案3】:

      我可能误解了你在上一个问题中试图做的事情。

      这行得通吗?它将您的“matchWordsList”组合成一个表达式,然后将bigList 中的每个匹配项添加到resultsList

      var escapedStrings = matchWordsList.Select(s => Regex.Escape(s)); 
      var regex = new Regex("\\b(" + string.Join("|", escapedStrings) + ")\\b");
      foreach (string str in bigList)
      {
          if (regex.IsMatch(str))
          {
              resultsList.Add(str);
          }
      }
      

      所以如果matchWordsList 包含["test","words","cheese"],并且str"This is a test to check if Regex is matching words. I like cheese.",它会将str 添加到resultsList 一次(即使有3 个匹配项)。

      Try it online

      【讨论】:

      • 嗯,这看起来像是对我上一个问题的回答,但在这个主题中,我必须根据特定问题标记另一个问题。您能否在上一篇文章中使用此代码编辑您的答案,以便我能够将其标记为答案,请
      • 我觉得我对你之前问题的回答是正确的。您想要上一个问题中的 index 匹配项。在这个问题中,您似乎只想记录与“matchWordsList”中的一个值匹配的字符串列表,因此我的答案不同。这不正确吗?
      最近更新 更多