2014-09-26 82 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