2016-02-25 64 views
4

我試圖匹配字符串中數字的位數。這裏是我的MySQL查詢的一部分匹配空格後的字符串中的位數

SELECT digits, concat(digits, ' Digits ') as selects, count(*) as count 
        FROM (SELECT (case WHEN `no` REGEXP '[[:<:]][0-9]{1}[[:>:]]' then '1' 
             WHEN `no` REGEXP '[[:<:]][0-9]{2}[[:>:]]' then '2' 
             WHEN `no` REGEXP '[[:<:]][0-9]{3}[[:>:]]' then '3' 
             WHEN `no` REGEXP '[[:<:]][0-9]{4}[[:>:]]' then '4'  
            end) AS digits 
          FROM `no_ads` AS a 
....... 
....... 

問題是在這樣4U 24U 2 a我的查詢字符串會算成2個數字時,它應該算作1([[:<:]][0-9]{1}[[:>:]])。我如何在第一空間後開始計數?

+0

的'[[:<:]] [0-9] {2} [[:>:]]'圖案不能匹配'4U 2 A'任何東西。我相信這裏的正則表達式不是要責怪。 –

+0

使用這個http://stackoverflow.com/questions/986826/how-to-do-a-regular-expression-replace-in-mysql你可以替換除數字之外的所有東西,然後做一個字符串長度 – ritesht93

回答

0

您的查詢會匹配第一個word中只有數字的位數,您可以在這裏看到縮減的測試用例。所以你的查詢實際上是工作的,如果你認爲你只有一個這樣的數字,並且你可以在測試集中看到你的例子。

SELECT t, (case 
    WHEN `t` REGEXP '[[:<:]][0-9]{1}[[:>:]]' then '1' 
    WHEN `t` REGEXP '[[:<:]][0-9]{2}[[:>:]]' then '2' 
    WHEN `t` REGEXP '[[:<:]][0-9]{3}[[:>:]]' then '3' 
    WHEN `t` REGEXP '[[:<:]][0-9]{4}[[:>:]]' then '4'  
    end) AS digits 
FROM test; 

+---------------+--------+ 
| t    | digits | 
+---------------+--------+ 
| 23   | 2  | 
| 4U 2   | 1  | 
| 4U 2 a  | 1  | 
| 4U 23 a  | 2  | 
| Ad 34 34 34 d | 2  | 
| 4U 2 23 a  | 1  | 
+---------------+--------+ 

無論如何,如果你想要的,一般以匹配一行的第一個空間後會發生什麼,你可以使用^([[:alnum:]]+[[:blank:]]),其中^是字符串的開始標誌。

See here the full list of Syntax of Regular Expressions