MySQL - 查询返回值匹配REGEX模式

时间:2017-04-16 13:26:36

标签: mysql sql regex iis

我有大量的自由格式化文本字符串表存储在MySQL数据库中。在每个字符串中,我必须找到三个特定格式的子字符串。这个问题看起来非常适合MySQL REGEXP模式匹配。

我知道MySQl REGEXP运算符只返回True或False。此外,因为我需要处理大型表,所以我需要在MySQL中实现目标,而不是涉及PHP或任何其他服务器端语言。

源数据示例:

FirstEntry_somestring_202320047A_210991957_700443250_Lieferadresse:_modified string c/o Logistics, some address and another text

SecondEntry_hereisanothertext_210991957_text_202320047A_and_700443250_another text which does not have any predefined structure

ThirdEntry_700443250_210991957_202320047A_Lieferadresse:_here some address, Logistics, and some another text with address.

FourthEntry some very long text before numbers__202320047A-700443250-210991957-Lieferadresse:, another text with address and company name. None of this text has predefined structure

上面的示例是在MySQL表中存储为TEXT数据类型的四个字符串。他们没有任何具体的结构。但我知道,每个记录中的某个地方必须是三个自由分隔的数字,但它们具有特定的格式:

  1. 正则表格格式:' \ d {3}(30 | 31 | 32)\ d {4} [A-Z])'
  2. 正则表格格式:'(\ d {3}(99)\ d {4})')
  3. 正则表格格式:'((700)\ d {6})'
  4. 你能帮我解决一下如何在上面的文字中找到与正则表达式相匹配的子串吗?

    服务器运行于:

    • Windows操作系统
    • IIS 7
    • MySQL for Windows
    • PHP
    • ...

    谢谢!

2 个答案:

答案 0 :(得分:1)

MariaDB 10.0.5(自2013年起)几乎与MySQL相同,但它包含全套REGEXP。它还有REGEXP_REPLACE()

请参阅https://mariadb.com/kb/en/mariadb/pcre/

答案 1 :(得分:0)

对于那些对这个问题感兴趣的人,我使用MySQL存储过程开发了自己的解决方案。

我认为,这是StackOverflow上有关此主题的最有价值的解决方案,因为它提供了真正的解决方案。与其他人相比,只提出了含糊不清的想法:

-- Return REGEX Value
DELIMITER $$

DROP PROCEDURE IF EXISTS RETURNREGEX$$
CREATE PROCEDURE RETURNREGEX(IN strSentence VARCHAR(1024), IN regex_str VARCHAR(1024), IN length_str INT )
    BEGIN

        DECLARE index_str INT DEFAULT 0;
        DECLARE match_str VARCHAR(1024) DEFAULT '';
        DECLARE result BOOL DEFAULT FALSE;

        REPEAT
            -- Get substring with predefined length
            SELECT SUBSTRING(strSentence, index_str, length_str) INTO match_str;

            -- compare this substring agains REGEX to see if we have match
            SELECT match_str REGEXP regex_str INTO result;

            SET index_str = index_str + 1;

        -- evaluate result (TRUE / FALSE)
        UNTIL result OR index_str > length(strSentence)
        END REPEAT;

        IF result = TRUE THEN SELECT match_str;
        ELSE SELECT NULL;
        END IF;
    END$$
DELIMITER ;