2013-02-14 65 views
2

根據這個鏈接Search for 「whole word match」 with SQL Server LIKE pattern搜索數據表中的「精確匹配詞」使用正則表達式

我想按照同樣的查詢字符串,但在一個DataTable我已經寫了下面的語句

假設的DataTable包含以下記錄

datatable[0]["src"]="tst"; 
datatable[1]["src"]="tst,"; 
datatable[2]["src"]="tst:"; 
datatable[3]["src"]="disney"; 

int p=datatable.AsEnumerable().Select(a => Regex.IsMatch(a["src"].ToString(), "[^a-z]windows[^a-z]")).Count(); 

但結果卻是p = 4,而這個詞「窗口」只存在3倍

而且在使用「其中」代替的情況下,「選擇」如下

int p=datatable.AsEnumerable().Where(a => Regex.IsMatch(a["src"].ToString(), "[^a-z]windows[^a-z]")).Count(); 

p是始終爲0

什麼是錯誤的,我發言..Any建議?

+1

我不明白你的意思是什麼*「結果是p = datatable行計數,而這個單詞'windows'並不存在於所有行」*你是說它是返回所有行的計數,並且不是僅包含單詞「windows」的行數? – 2013-02-14 19:17:14

+0

這條語句返回所有可數據行的數量,而這些行中的某些行中存在關鍵字'windows',但並非全部都是這樣。 – user690069 2013-02-14 19:18:49

+0

對不起,但我仍不清楚你的意思。告訴我們你期望p包含什麼,以及它實際包含什麼。 – 2013-02-14 19:19:51

回答

2

您的第一個示例(Select)在數據表中的所有行上運行該操作。結果將是一個布爾值列表,指示行值是否與表達式匹配。

在這兩種情況下,您的模式爲,因此需要在單詞「windows」之前和之後爲非alpha,導致它不匹配。在第一種情況下,你會得到一個包含4個「假」值的列表,而在第二種情況下你什麼也得不到。

我認爲最簡單的正則表達式來得到你想要的東西大概是這樣的:

"\bwindows\b" 

(使用羅伯特·哈維的建議正則表達式這種模式斷言,有一個「字符」 - 包括什麼都沒有 - 前後。 。後字)

+0

@RobertHarvey我會去,雖然LIKE匹配也不會斷言整個詞匹配。 – GalacticCowboy 2013-02-14 19:52:02

+1

這就是人們在不理解工作原理的情況下解除代碼的情況。 – 2013-02-14 19:54:30

0

SelectWhere不能互換 - 你的選擇將返回一個truefalse值爲每個記錄,這就是爲什麼你的計數是4(因爲你有4條,因此4返回值

您的where子句返回0告訴我您的RegEx與0-2值不匹配。我會驗證RegEx按預期工作。

+0

你的正則表達式也匹配'xwindows'。 – 2013-02-14 20:01:39

+0

由於關於OP的預期匹配的確切內容很少,所以我做了一個猜測...... – 2013-02-14 20:03:17

+0

是的@RobertHarvey說你的正則匹配即xwindows我只想匹配相同的關鍵字,除了考慮標點符號如分號,逗號等..like(windows;) – user690069 2013-02-14 20:06:51