簡體   English   中英

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

[英]Preserve whitespace using the Contains method in .NET

我正在嘗試將項目添加到列表的“文本”值包含字符串數組中任何指定單詞的列表中。 例如:

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和4添加到我的動態列表中。

到目前為止,這是我的代碼,它確實返回了我想要的項目,但是問題在於它還返回了行,該行的值還包括該單詞的一部分。 例如,單詞“ win”還返回“ window”,“ winning”等。(我正在從MySQL數據庫中獲取原始數據,因此是DataReader)

string[] myArray = { " win ", " win." };

if(myArray.Any(reader["text"].ToLower().Contains))
{
    list.Add(new{
        Text = reader["text"].ToString()
    });
}

我首先想到的是在字符串數組中的項目周圍添加空格(如果單詞在句子的末尾也添加了“。”),但是我的代碼中的某些內容似乎正在去除/忽略這些空格。

是否有使用當前方法的解決方案,或者通常有更好的方法呢?

Contains所做的不僅僅是檢查源中是否包含一段文本。 它考慮了當前的文化。

我建議使用IndexOf (如MSDN文檔中的建議),該文本與文字完全匹配:

if(myArray.Any(s => reader["text"].ToLower().IndexOf(s) >= 0))

因此,通過正則表達式轉義搜索短語並將其與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));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM