2011-09-12 29 views
4

これは愚かな要求のように思えるかもしれませんが、私はとにかく尋ねるつもりです。私は数字のリスト内のすべてのn番目のコンマを見つけるために、正規表現を使用したい正規表現n番目の一致

は、IE:

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

し、「\ rを\ n」は、それによって回すことによって置き換えられて4回ごとにカンマを「」持つことができます4行×n行のグリッドへの数値のリスト。すべてのコンマを見つけ

は簡単だった:上記のリストからすべてのカンマを検索します

[^0-9] 

。どのようにしてこれらのマッチをグループ化して、4つおきに3つを除外することができますか?

私はこれを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番目のカンマを選択できる正規表現で十分です。

これで問題がはっきりわかることを願っています。

フィン

編集:私はにpreg_replace機能が含まれている奉仕にlib_mysqludf_pregライブラリを追加した

。これはMySQL用のPCRE実装であり、4分の1を選択する正規表現の問題に答えることができ、 '、\ r \ n'で置き換えることができます。

+0

([0-9] * [^ 0-9]){4} –

+0

ありがとうございましたJamesさん、 以下のTimと非常によく似た回答です。彼への反応と更新された質問をご覧ください。 ありがとう、 フィン – Fin

+1

私はMySQLを使っていませんが、編集権を読んでいれば、今は 'preg_replace'にアクセスできるようになりますので、@ Timの解決策は実行可能でなければなりません。 –

答えて

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

これは、行の4つのカンマで区切られた値と一致した(私はあなたがグループ内の文字列の内部にコンマを持っていないことを仮定している)と、それらの後にCRLFを追加します。貢献しているすべての

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

多くの感謝:

[EDIT] 上記はlib_mysqludf_pregと使用をインストールし、純粋なMySQLのソリューションでは、PHPベースのソリューション

です。

+1

あなたのアンサーティムのおかげで、それは私がやりたいことに非常に近いですが、かなりありません。あなたの正規表現は、すべての4番目のカンマと一致する必要がありますが、つまり、 '88574,93243,129659,135504'の文字グループ全体と一致させることです: 88574,93243,129659,135504,136357,141052,141619、 141619,142195,144622,144946,177824、... いいえいいえいいえいいえいいえいいえいいえいいえいいえはいいいえ 結果がMySQL関数によって処理されているため、PHPを使用できません。 これがはっきりとわかるようにしてください。 – Fin

+0

MySQLの正規表現はこの作業には対応していません。正規表現と一致するか一致しない列のみを選択できます。それでおしまい。 –

+0

Thanks again Tim、 – Fin

1

すべてのカンマをマッチさせる場合は、よりストレートなパターン,も機能します。

4桁ごとに一致するように、MySQLがルック・バックをサポートしている場合は、おそらく(?<=(^|\r\n)(\d+,){3}\d+),を使用できます。これは、次のマッチが行われる前に各置換が実行されることを前提としています。それ以外の場合はおそらく(?<=^((\d+,){4})*(\d+,){3}\d+),が動作します。

+0

MySQLはlookbehindアサーションをサポートしていません。 lookbehindの中で無期限に繰り返すことは言うまでもない。あなたの正規表現は、.NETでうまく動作します。 –

+0

ありがとう!その疑いのある種類。しかし、試してみる価値があった。 – henko

+0

ありがとうHenko、 最後の1つは、カンマの4番目のインスタンスを選択することです(4分の1)。私は最後に質問を更新しました。 – Fin

関連する問題