簡體   English   中英

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

[英]MySQL - Query Returning Values Matching REGEX Patterns

我在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} [AZ])'
  2. 正則表達式格式: '(\\ d {3}(99)\\ d {4})')
  3. 正則表達式格式: '(((700)\\ d {6})'

您能幫我怎樣獲得與上面文本中的Regex模式匹配的子字符串?

服務器運行在:

  • Windows操作系統
  • IIS 7
  • Windows版MySQL
  • 的PHP
  • ...

謝謝!

MariaDB 10.0.5(從2013年開始)實際上與MySQL相同,但是它包含完整的REGEXP。 它還具有REGEXP_REPLACE()

參見https://mariadb.com/kb/en/mariadb/pcre/

對於那些對此問題感興趣的人,我已經使用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 ;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM