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

Posted

技术标签:

【中文标题】将正则表达式匹配转换为字符串列表【英文标题】:Convert regex matches to the list of strings 【发布时间】:2019-06-23 05:24:40 【问题描述】:

我正在尝试在大约 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);然后编译器会发现错误而不是得到运行时错误。 【参考方案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”中的一个值匹配的字符串列表,因此我的答案不同。这不正确吗?

以上是关于将正则表达式匹配转换为字符串列表的主要内容,如果未能解决你的问题,请参考以下文章

将 c# 正则表达式转换为 javascript 正则表达式

如何将 Java 字符串转换为模式正则表达式?

在正则表达式中匹配字符串中的数字并转换为整数[重复]

正则表达式之元字符

[第三节] 正则表达式 - 元字符

Pandas使用split函数基于指定分隔符拆分数据列的内容为列表设置expand参数将拆分结果列表内容转化为多列数据并添加到原数据中replace函数基于正则表达式替换字符串数据列中的匹配内容