使用.NET中的Contains方法保留空格

时间:2016-03-14 14:17:44

标签: c# .net

我正在尝试将项添加到列表中,其中'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()
    });
}

我首先想到在字符串数组中的项目周围添加空格(以及'。',这个单词位于句子的末尾),但我的代码中的某些东西似乎是剥离/忽略空格。

是否有使用我当前方法的解决方案,或者通常有更好的方法吗?

2 个答案:

答案 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));