1. ホーム
  2. マイスル

[解決済み】MySQLで正規表現による置換を行うには?

2022-04-13 12:03:13

質問

500k行のテーブルがあり、varchar(255) UTF8カラムがあります。 filename には、ファイル名が含まれています。

ファイル名から様々な奇妙な文字を取り除こうとしている。文字クラスを使おうと思った。 [^a-zA-Z0-9()_ .\-]

では MySQLに正規表現で置換できる関数はありますか? ? REPLACE()関数と同じような機能を探しているのですが、簡単な例を以下に示します。

SELECT REPLACE('stackowerflow', 'ower', 'over');

Output: "stackoverflow"

/* does something like this exist? */
SELECT X_REG_REPLACE('Stackoverflow','/[A-Zf]/','-'); 

Output: "-tackover-low"

について知っています。 REGEXP/RLIKE をチェックするだけです。 もし ではなく、一致する である。

(I かもしれない をする。 SELECT pkey_id,filename FROM foo WHERE filename RLIKE '[^a-zA-Z0-9()_ .\-]' をPHPスクリプトから実行します。 preg_replace とし、" UPDATE foo ... WHERE pkey_id=... しかし、それは最後の手段であるスロー&醜いハックのように見える)

解決方法は?

とは MySQL 8.0+ をネイティブで使用することができます。 REGEXP_REPLACE 関数を使用します。

12.5.2 正規表現 :

REGEXP_REPLACE(expr, pat, repl[, pos[, occurrence[, match_type]]])

文字列の中に現れるものを置き換えます。 expr で指定された正規表現にマッチするもので、パターン パット という置換文字列で repl という文字列を返します。もし expr , パット または レップ NULL であれば、返り値は NULL .

そして 正規表現のサポート :

前回は MySQL は Henry Spencer 正規表現ライブラリを使用し、正規表現演算子 ( REGEXP , RLIKE ).

正規表現のサポートは、International Components for Unicode (ICU) を使用して再実装されており、完全な Unicode サポートとマルチバイト・セーフを提供します。そのため REGEXP_LIKE() 関数と同じように正規表現マッチングを行います。 REGEXPRLIKE 演算子で、現在はその関数の同義語になっています。 さらに REGEXP_INSTR() , REGEXP_REPLACE() そして REGEXP_SUBSTR() 関数があり,それぞれマッチする位置を探したり,部分文字列の置換や抽出を行うことができます。

SELECT REGEXP_REPLACE('Stackoverflow','[A-Zf]','-',1,0,'c'); 
-- Output:
-tackover-low

DBFiddleのデモ