将正则表达式匹配转换为字符串列表
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);
到列表
【问题讨论】:
列表应该包含什么? @JohnresultsList
必须为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 正则表达式
Pandas使用split函数基于指定分隔符拆分数据列的内容为列表设置expand参数将拆分结果列表内容转化为多列数据并添加到原数据中replace函数基于正则表达式替换字符串数据列中的匹配内容