2013-04-07 44 views
3

我的任務是爲不同字符串中的條目創建黑名單。我正在使用MySQL檢查數據庫中的條目。使用字邊界時的奇怪行爲[[:<:]] and [[:>]]

你可能知道單詞邊界標誌着MySQL[[:<:]][[:>:]]對應於\b在默認情況下正則表達式。

當一個字符串中有regexp special charactersword boundary marks時出錯。

但是這些角色是通過雙反斜槓逃脫的!

只要運行這個查詢

SELECT 
"test()" REGEXP "[[:<:]]test\\(\\)[[:>:]]", 
"test()" REGEXP "test\\(\\)", 
"test" REGEXP "[[:<:]]test[[:>:]]", 
"test" REGEXP "test" ; 

,你會得到

0 | 1 | 1 | 1 

相反的預期

1 | 1 | 1 | 1 

可能有人,請解釋一下如何解決這個問題?

回答

1

不要以爲你可以在MySQL中做到這一點。由於沒有lookarounds(並且沒有辦法否定[[:<:]][[:>:]]?)。

取決於你如何定義字邊界(尤其是在非單詞字符都參與其中,如[^A-Za-z0-9_]),你可以在某些情況下使用的表達,如:

(^|[[:space:]])test\(\)($|[[:space:]]) 
+0

感謝您指出解決方案,這工作! – vikingmaster 2013-04-07 22:32:02

3

第一次失敗,因爲最後一個單詞邊界不能匹配單詞邊界:右括號和字符串的結尾不是單詞邊界位置。引述mysql reference給出的定義:「一個字是不是由前面或後面的單詞字符單詞字符序列

作爲一個側面說明,它不會再工作語言。

+0

謝謝你的問題的描述,現在的我得到它。投票。 – vikingmaster 2013-04-07 22:31:27