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

时间:2019-01-30 01:11:42

标签: c# regex linq substring contains

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

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

直接从matcheslist获取字符串会引发异常:

  

发生类型为'System.InvalidCastException'的未处理异常   在test.exe中

     

其他信息:无法转换类型的对象   “ System.Text.RegularExpressions.Match”键入“ System.String”。

因此,我正在尝试找出将var matches = regex.Matches(str);转换为列表的热门方法

3 个答案:

答案 0 :(得分: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));

答案 1 :(得分:1)

Match循环中仅使用foreach类型:

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

答案 2 :(得分:1)

我可能误解了您在上一个问题中想做的事情。

这项工作吗?它将您的“ 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