2016-07-01 79 views
2

我試着在MySQL匹配與REGEXP關鍵字如下:如何逃脫在MySQL中星號(*)的REGEXP

-- Match "fitt*", the asterisk "*" is expected to be matched as-is 

> select 'aaaa fitt* bbb' regexp '[[:<:]]fitt\*[[:>:]]'; -- return 1, ok 
> select 'aaaa fitttttt* bbb' regexp '[[:<:]]fitt\*[[:>:]]'; -- return 1 as well, but should return 0 

> select 'aaaa fitt* bbb' regexp '[[:<:]]fitt\\*[[:>:]]'; -- return 0, failed 

如何爲了逃避星號(*)精確的字符*匹配嗎?

+1

問題不在於星號,它與'[[:>:]]''。這隻能匹配單詞邊界,但'*'和空格之間沒有單詞邊界,因爲'*'不是單詞字符。 – Barmar

+0

@Barmar謝謝。但是如何將'fitt *'與REGEXP匹配? – Zelong

+0

基於@Barmar和我之間的爭論,我改變了標題。 –

回答

1

\\*是匹配星號的正確方法。但[[:>:]]後面將不匹配,因爲它只匹配單詞字符和非單詞字符,並且*不是單詞字符。相反,你需要明確地匹配一個非單詞字符。因爲這是另一種類型的單詞邊界,所以還需要一個替代方案。

> select 'aaaa fitt* bbb' regexp '[[:<:]]fitt\\*([^[:alnum:]]|$)'; -- returns 1 
> select 'aaaa fitttttt* bbb' regexp '[[:<:]]fitt\\*([^[:alnum:]]|$)'; -- returns 0 

顯式匹配星號的另一種方法是將它放在一個字符類中。

> select 'aaaa fitt* bbb' regexp '[[:<:]]fitt[*]([^[:alnum:]]|$)'; -- returns 1 
> select 'aaaa fitttttt* bbb' regexp '[[:<:]]fitt[*]([^[:alnum:]]|$)'; -- returns 0 
+0

編號'\\ *'表示零或多個反斜槓。你的測試_happens_工作,因爲它找到了零反斜槓,然後是'*',它不是'alnum'。 –

+0

@RickJames第一個反斜槓轉義字符串中的第二個反斜槓。結果反斜槓轉義正則表達式中的'*'。 – Barmar

+0

如果我在被測試的字符串中加一個反斜槓,它不符合它。 – Barmar

0

可能有3個問題:

項目1:答案標題問題或者是這些:

\\* (in the regexp) 
[*] 

項目2:\\\\*如果你可以需要來自某個客戶端,它先將反饋提供給MySQL,然後再反斜槓。但是,如書面(沒有任何客戶端代碼),\\\\*被視爲零或更多反斜槓。

項目3:@ Barmar的答案集中在爲什麼[[:>:]]不正確。

+0

如果你在查詢中直接寫字符串,那麼'\\ *'是必需的,因爲MySQL本身首先會使用反斜槓。 – Barmar

+0

如果您使用的客戶端編程語言也是unescapes,那麼您需要再次將其翻倍,例如'$ sql =「SELECT'aaaa fitt * bbb'regexp'[[:<:]] fitt \\\\ *([^ [:alnum:]] | $)'」;'在PHP中。 – Barmar

+0

@Barmar和Zelong - 我在mysql命令行工具中測試;你在測試什麼? –