2014-09-26 72 views
1

假設我有與被引用的字符串隨機字符內像這樣的字符串:提取子

一:15:I:0:3: 「FOO」 我:1S:3: 「BAR」 I:2S:3: 「BAZ」 我:3秒:3: 「ALPHA100」 我:4S:3: 「ALPHA500」 我:5秒:3: 「BRAVO250」 我:6S:3

我想喜歡匹配其中總是包含三個大寫字母或五個大寫字母后面跟三個數字的引用字符串。在JavaScript我可以這樣做:

" the string ".match(/"([A-Z]{3}|[A-Z]{5}\d{3})"/g); 

我進去看了REGEXP運營商MySQL,但似乎只適用於有條件的條款。

理想情況下,我想選擇所有的字符串,剪掉了引號,並做了GROUP_CONCAT找回這樣的最終結果集中一行:

"FOO,BAR,BAZ,ALPHA100,ALPHA500,BRAVO250" 

理想情況下,我想在數據庫級別執行此操作以避免下載所有字符串並通過我的單行JavaScript程序運行它們。

回答

0

我將展示基於字符串分割如圖SQL split values to multiple rows

SELECT get_the_parts(theString) FROM example; 

此功能要使用的功能的作用類似於此: - 採用雙分割字符串成表零件引號作爲定界符 - 僅選擇嚴絲合縫3大寫字母或5個大寫字母隨後三位數字 那些部件 - 串接的選定部分與逗號作爲隔板

DELIMITER // 
CREATE FUNCTION get_the_parts(myString VARCHAR(2000)) RETURNS VARCHAR(2000) 
BEGIN 
    DECLARE result VARCHAR(2000); 

    SELECT 
    GROUP_CONCAT(t.value) INTO result 
    FROM (
     SELECT 
     SUBSTRING_INDEX(SUBSTRING_INDEX(e.col, '"', n.n), '"', -1) value 
     FROM (SELECT myString AS col) e 
     CROSS JOIN (
     -- creates a numbers table with the values from 1 to 1,000 on the fly 
     SELECT 
      1 + a.N + b.N * 10 + c.N * 100 AS n 
     FROM 
      (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a 
      ,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b 
      ,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) c 
     ORDER BY n  
    ) n 
     WHERE 
     n.n <= 1 + LENGTH(myString) - LENGTH(REPLACE(myString, '"', '')) 
    ) t 
    WHERE 
     t.value REGEXP '^([A-Z]{3}|[A-Z]{5}[0-9]{3})$'; 

    return result; 
END // 
DELIMITER ; 

說明

創建一個數字表

UNION ALL最裏面的子查詢中從1飛了一個數字表,數字到1000這個子查詢可以創建一個數字表在你的數據庫很容易取代。

分割字符串

隨着SUBSTRING_INDEX一個嵌套調用我們削減在隔板之間的第n個串。我們使用雙引號作爲分隔符:

SUBSTRING_INDEX(SUBSTRING_INDEX(e.col, '"', n.n), '"', -1) 

表達

1 + LENGTH(myString) - LENGTH(REPLACE(myString, '"', '')) 

給了我們部分的數量,因爲它是一個發生率比隔膜的出現了。

選擇所需的部分

我們使用正則表達式

'^([A-Z]{3}|[A-Z]{5}[0-9]{3})$' 

,因爲我們的部分已經得到了從一開始就^已知的正則表達式完全匹配,直到最後$無需更多的內容。

串聯

最後,我們使用GROUP_CONCATE使用默認的分隔符,逗號,以獲得期望的結果。

備註

我已經建立了一個Demo
您可以輕鬆修改此功能以滿足您的需求。
你真的喜歡這個嗎?我會建議使用你的單行javascript。這種形式的文本處理並不是真正關係數據庫最好的。

+0

這當然是相當的功能,但我想我會堅持我的JavaScript代碼行:-P – 2014-09-30 06:20:18