我正在尝试将项添加到列表中,其中'text'值包含字符串数组中的任何指定单词。例如:
string[] myArray = { " win ", " win." };
Item 1 | Enter to win something!
Item 2 | Windows is better than Mac OS
Item 3 | Winning is great
Item 4 | I hope that I will win some money
在这些项目中,我只想添加第1项和第1项。 4到我的动态列表。
到目前为止,这是我的代码,它确实返回了我想要的项目,但问题是它还返回了哪些行的值也包含该单词的一部分。例如。 'win'这个词也会返回'window','wins'等。(我从MySQL数据库中获取原始数据,因此是DataReader)
string[] myArray = { " win ", " win." };
if(myArray.Any(reader["text"].ToLower().Contains))
{
list.Add(new{
Text = reader["text"].ToString()
});
}
我首先想到在字符串数组中的项目周围添加空格(以及'。',这个单词位于句子的末尾),但我的代码中的某些东西似乎是剥离/忽略空格。
是否有使用我当前方法的解决方案,或者通常有更好的方法吗?
答案 0 :(得分:4)
Contains
不只是检查源文件中是否包含一段文字。它考虑了当前的文化。
我建议使用IndexOf
(如documentation on MSDN中推荐的那样)来进行文字的字面匹配:
if(myArray.Any(s => reader["text"].ToLower().IndexOf(s) >= 0))
答案 1 :(得分:2)
因此,通过正则表达式转义搜索短语并将它们与OR替换|
组合,并用表达式围绕它们以匹配空格,(某些)标点符号或行的开头或结尾,您可以构造一个正则表达式,只有当搜索短语中存在空格或标点符号时才匹配。
var punctuation = @"/\.,:;'""!";
var escapedPunctuation = Regex.Escape(punctuation);
var myArray = new[]{ "win", "fun" };
var searchPatterns = myArray
.Select(Regex.Escape);
var alternatedPatterns = string.Join("|", searchPatterns);
var fullRegexPattern = string.Format(@"((^|\s|[{0}]){1}($|\s|[{0}]))",
escapedPunctuation,
alternatedPatterns);
// so regex pattern is:
// ((^|\s|[/\\\.,:;'"!])win|fun($|\s|[/\\\.,:;'"!]))
var itemsToSearch = new[]{"Enter to win something!",
"Windows is better than Mac OS",
"Winning is great",
"I hope that I will win some money",
"Windows, win, woo",
"this is fun!"};
var matches = itemsToSearch.Where(i => Regex.IsMatch(i, fullRegexPattern));