簡體   English   中英

正則表達式匹配

[英]Regular Expressions nth match

我意識到這可能看起來像是一個愚蠢的請求,但無論如何我都會問。

我希望使用正則表達式來查找數字列表中的每個第n個逗號,即:

    88574,93243,129659,135504,136357,141052,141619,141619,142195,144622,144946,...

然后可以將每個第4個逗號','替換為',\\ r \\ n',從而將數字列表轉換為4行n行的網格。

找到所有逗號很簡單:

    [^0-9]

從上面的列表中可以找到所有逗號。 我現在如何將這些匹配分組以排除每四個中的三個。

我可以用PHP preg_matches來做這個,但我使用的是mysql正則表達式替換函數,所以更喜歡純正則表達式的答案(如果存在)。

我在MySQL中使用的函數如下:

    DROP FUNCTION IF EXISTS `regex_replace`$$  

    CREATE DEFINER=`root`@`127.0.0.1`   
    FUNCTION `regex_replace`(pattern VARCHAR(1000),replacement VARCHAR(1000),original TEXT)   
    RETURNS VARCHAR(1000) CHARSET latin1  
        DETERMINISTIC  
    BEGIN  
     DECLARE temp VARCHAR(1000);  
     DECLARE ch VARCHAR(1);  
     DECLARE i INT;  
     SET i = 1;  
     SET temp = '';  
     IF original REGEXP pattern THEN  
     loop_label: LOOP  
       IF i>CHAR_LENGTH(original) THEN  
                 LEAVE loop_label;  
       END IF;  
       SET ch = SUBSTRING(original,i,1);  
         IF NOT ch REGEXP pattern THEN  
            SET temp = CONCAT(temp,ch);  
       ELSE  
          SET temp = CONCAT(temp,replacement);  
                END IF;  
       SET i=i+1;  
              END LOOP;  
     END IF;  
     RETURN temp;  
    END$$  

你可以看到正則表達式,它自己不必處理復雜的匹配。 因此,能夠選擇第n個逗號的正則表達式就足夠了。

我希望這能澄清這個問題。

編輯:

我已將lib_mysqludf_preg庫添加到包含preg_replace函數的服務器中。 這是一個針對MySQL的PCRE實現,如果我可以回答正則表達式的問題,選擇每四分之一','並用',\\ r \\ n'替換,那么它應該可以工作。

$result = preg_replace('/(?:[^,]*,){4}/', '\0\r\n', $subject);

這匹配一行中的四個逗號分隔值(我假設你在組內的字符串中沒有逗號)並在它們之后添加一個CRLF。

[編輯]以上是基於PHP的解決方案

對於純MySQL解決方案,請安裝lib_mysqludf_preg並使用:

    SELECT preg_replace('/(?:[^,]*,){4}/', '${0}\r\n', `fieldname`) as 'new_layout' from `tablename`;

非常感謝所有貢獻。

如果你想每一個逗號匹配,那么更直接的方式,也能發揮作用。

為了匹配每四個逗號,如果MySQL支持look-behind,也許你可以使用(?<=(^|\\r\\n)(\\d+,){3}\\d+), 然而,假設每次替換都是在下一場比賽之前進行的。 否則也許(?<=^((\\d+,){4})*(\\d+,){3}\\d+),會起作用。

暫無
暫無

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

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