2015-10-20 108 views
1

使用Regex.Matches我的印象是,你會進入一些這樣:Regex.Matches沒有返回預期

private static int CheckForWordMatch(string offer, string item) 
    { 
     string pattern = @"\b(" + item + ")\b"; 
     int count = 0; 
     count = Regex.Matches(@offer, pattern).Count; 
     return count; 
    } 

測試參數:

offer = AK47HyperBeastFieldTested 
item = AK47HyperBeastFieldTested 

我在尋找確切的詞匹配所以如果物品是「AK47HyperBeast」,它不會返回匹配計數2.

我在這裏做錯了什麼?

回答

4

你忘了使用逐字字符串與第二@)\b字邊界。您的")\b"被視爲)和退格字符。

string pattern = @"\b(?:" + item + @")\b"; 

See C# demo

string offer = "AK47HyperBeastFieldTested"; 
string item = "AK47HyperBeastFieldTested"; 
string pattern = @"\b(" + item + @")\b"; 
int count = Regex.Matches(offer, pattern).Count; 
Console.WriteLine(count); 

一些建議使用(^|\b)(\b|$) - 這是多餘的,因爲\b(字邊界)在那些位置已經匹配。

如果您item可以開始或用非單詞字符結尾,但你仍然需要一個全字匹配,使用

string pattern = @"(?<!\w)(" + item + @")(?!\w)"; 

另外請注意,只有當您計劃使用所需要的圓括號更改(例如\b(word|another)\b)。如果您一次只測試一個字,您可以安全地將其移除。

+0

他錯過了另一部分'@'右...........錯過+1 – vks

+1

非常感謝您提供清晰簡潔的解釋。並補充一點,所以我實際上錯過了一個'@'逐字串指示符!我已經清理了'item'字符串和'offer'字符串以僅包含字母,謝謝您提供更多信息。 – MattGarnett

+0

@MattGarnett:不用客氣,連接字符串時很容易忘記'@'符號。 –

0

\b是你沒有在offer。相反使用

string pattern = @"^\S*(" + item + @")\S*$"; 
+0

不,字符邊界在字符串的開始和結尾匹配。 '\ S'也是錯誤的,因爲它匹配任何非空白字符。你是不是指'\ s'?這也是錯誤的,因爲多於空白被認爲是文字邊界。在C#中,[\ b anchor指定匹配必須出現在單詞字符(\ w語言元素)和非單詞字符(\ W語言元素)]之間的邊界上(https://msdn.microsoft .COM/EN-US /庫/ h5181w5w(v = vs.110)的.aspx#WordBoundary)。你可以用'(?<^ | \ W)'來模擬開始字邊界,並用'(?= $ | \ W)'結束字邊界。 – ErikE

+0

不,字符邊界在字符串的開始和結尾匹配。 '\ S'也是錯誤的,因爲它匹配任何非空白字符。你是不是指'\ s'?這也是錯誤的,因爲多於空白被認爲是文字邊界。 [在C#中,\ b錨點指定匹配必須出現在單詞字符(\ w語言元素)和非單詞字符(\ W語言元素)]之間的邊界上(https://msdn.microsoft .COM/EN-US /庫/ h5181w5w(v = vs.110)的.aspx#WordBoundary)。你可以用'(?<=^| \ W)'來模擬開始字邊界,並用'(?= $ | \ W)'結束字邊界。 – ErikE