我正试图在大约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);
}
}
}
直接从matches
到list
获取字符串会引发异常:
发生类型为'System.InvalidCastException'的未处理异常 在test.exe中
其他信息:无法转换类型的对象 “ System.Text.RegularExpressions.Match”键入“ System.String”。
因此,我正在尝试找出将var matches = regex.Matches(str);
转换为列表的热门方法
答案 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场比赛。)