2015-10-14 80 views
0

我遇到了一些轉換正則表達式與一個MySQL查詢工作的問題...MySQL的正則表達式 - 有問題

首先,這裏是一個http://www.regexr.com/鏈接... http://regexr.com/3c02t

正如你可以看到它是如何工作的。 6812是一個用戶提供的字符串,我想匹配所有以。結尾的實例。和3個數字字符。

但是,當我嘗試將此端口移植到MySQL查詢時,我正遇到磚牆。我試着做這個查詢,我沒有任何運氣。

SELECT 
    id 
FROM 
    mytable 
WHERE 
    summary REGEXP '^6812[.][0-9]{3}$' 
OR 
    detail REGEXP '^6812[.][0-9]{3}$' 

我環顧四周,在過去一小時,並嘗試了一堆不同的東西,但我不是在這裏的運氣不好。有人可能會指出我正確的方向,我可能做錯了什麼?

+0

我認爲沒有錯你的正則表達式http://sqlfiddle.com/#!9/9eecb7d/25632你有什麼問題? – Alex

回答

2

^$是錨,他們需要字符串完全匹配。特別是^是開始,$是結束。

在您提供的示例中,您沒有使用這些。

(6812)\.+[0-9][0-9][0-9] 

實際應該是

(6812)\.[0-9]{3}([^0-9]|$) 

所以,你的例子

Replace (24) 4569.000 with (24) 6812.000 

blah blah blah 6812.000. 

應返回true。我們正在檢查您的值,一段時間,然後是3個數字和一個非數字或字符串/列的結尾。

Regex101演示:https://regex101.com/r/sK0nN5/1

+0

啊!我誤解了^和$字符。刪除他們工作! – Calvin

0

當您有十進制數字時,有時候可能會發生有趣的事情。這是建議。

create table test (id decimal(10,4)); 
insert into test values (6812.123), (6812.1234); 

select * from test 
where id regexp '^6812[.period.][0-9]{3}0*$' 

Result: 
6812.1230 

select * from test 
where id regexp '^6812[.period.][0-9]{3}$' 

Result: nothing 

最後的查詢結果中沒有什麼是因爲decimal(10,4)導致4位輸出的小數點後。因此,^6812.123$是無與倫比的,因爲其實際數量是6812.1230

因此,如果您在這種情況下運行,請使用0*$在最後匹配零。

0

我不知道你的問題是什麼,但如果你需要檢查只有拉斯維加斯的4個字符相匹配,你可以從你的reg表達式刪除^符號:

SELECT 
    id 
FROM 
    mytable 
WHERE 
    summary REGEXP '\.[0-9]{3}$' 
OR 
    detail REGEXP '\.[0-9]{3}$' 

http://sqlfiddle.com/#!9/9eecb7d/25641