将正则表达式匹配转换为字符串列表
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 场比赛)。
我试图在大约 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 场比赛)。