将正则表达式匹配转换为字符串列表

Convert regex matches to the list of strings

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

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

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

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

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 抛出异常:

An unhandled exception of type 'System.InvalidCastException' occurred in test.exe

Additional information: Unable to cast object of type 'System.Text.RegularExpressions.Match' to type 'System.String'.

所以,我想弄清楚,如何将 var matches = regex.Matches(str); 转换为列表

你可以用 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));

只需使用 Match 输入 foreach 循环:

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

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

这行得通吗?它将您的 "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