Это может быть быстрее. Вы можете использовать Regex Groups следующим образом:
public List<string> Keyword_Search(HtmlNode nSearch)
{
var wordFound = new List<string>();
// cache inner HTML
string innerHtml = nSearch.InnerHtml;
string pattern = "(\\b" + string.Join("\\b)|(\\b", _keywordList) + "\\b)";
Regex myRegex = new Regex(pattern, RegexOptions.IgnoreCase);
MatchCollection myMatches = myRegex.Matches(innerHtml);
foreach (Match myMatch in myMatches)
{
// Group 0 represents the entire match so we skip that one
for (int i = 1; i < myMatch.Groups.Count; i++)
{
if (myMatch.Groups[i].Success)
wordFound.Add(_keywordList[i-1]);
}
}
return wordFound;
}
Таким образом, вы используете только одно регулярное выражение. И индексы групп должны коррелировать с вашим _keywordList со смещением 1, поэтому строка wordFound.Add(_keywordList[i-1]);
UPDATE:
После того, как я снова посмотрел свой код, я просто понял, что помещать совпадения в группы действительно не нужно. И у Regex Groups есть некоторые накладные расходы. Вместо этого вы можете удалить скобки из шаблона, а затем просто добавить сами совпадения в список wordFound. Это даст тот же эффект, но будет быстрее.
Это было бы что-то вроде этого:
public List<string> Keyword_Search(HtmlNode nSearch)
{
var wordFound = new List<string>();
// cache inner HTML
string innerHtml = nSearch.InnerHtml;
string pattern = "\\b(?:" + string.Join("|", _keywordList) + ")\\b";
Regex myRegex = new Regex(pattern, RegexOptions.IgnoreCase);
MatchCollection myMatches = myRegex.Matches(innerHtml);
foreach (Match myMatch in myMatches)
{
wordFound.Add(myMatch.Value);
}
return wordFound;
}