MariaDBで電話番号やメールアドレスを正規表現で抽出する方法
MariaDBで文字列から正規表現キャプチャグループを抽出する方法
REGEXP_EXTRACT
関数は、指定した文字列から正規表現にマッチする最初の部分文字列を抽出し、それを返します。構文は以下の通りです。
REGEXP_EXTRACT(string, regexp)
string
: 抽出対象の文字列regexp
: 一致する必要がある正規表現
例:
SELECT REGEXP_EXTRACT('電話番号は090-1234-5678です。', '(\d{3}-\d{3}-\d{4})') AS phone_number;
このクエリは、入力文字列から最初の電話番号 (090-1234-5678
) を抽出し、phone_number
という名前の変数に格納します。
REGEXP_REPLACE(string, regexp, replacement)
replacement
: 置換後の文字列
SELECT REGEXP_REPLACE('電話番号は090-1234-5678です。', '(\d{3})', '***') AS masked_phone_number;
このクエリは、入力文字列の電話番号部分を ***
に置き換えます。結果は以下のようになります。
電話番号は***-1234-5678です。
キャプチャグループの抽出
上記2つの関数を組み合わせることで、正規表現のキャプチャグループを抽出することができます。
SELECT REGEXP_EXTRACT(REGEXP_REPLACE('電話番号は(090)-(1234)-(5678)です。', '(\d+)', '*'), '(\d+)') AS phone_number;
このクエリは、まずREGEXP_REPLACE
関数を使用して、電話番号部分を *
に置き換えます。次に、REGEXP_EXTRACT
関数を使用して、置換後の文字列から最初のキャプチャグループ (090
) を抽出します。結果は以下のようになります。
090
補足
- 上記の例はほんの一例です。使用する正規表現や抽出方法は、目的に合わせて変更する必要があります。
-- 電話番号の抽出
SELECT REGEXP_EXTRACT('電話番号は090-1234-5678です。', '(\d{3}-\d{3}-\d{4})') AS phone_number;
-- 電話番号のマスク処理
SELECT REGEXP_REPLACE('電話番号は090-1234-5678です。', '(\d{3})', '***') AS masked_phone_number;
メールアドレスの抽出とドメイン部分の取得
-- メールアドレスの抽出
SELECT REGEXP_EXTRACT('[email protected]', '(\w+@\w+\.\w+)') AS email_address;
-- メールアドレスのドメイン部分の取得
SELECT REGEXP_EXTRACT('[email protected]', '@(\w+\.\w+)') AS domain;
IPアドレスの抽出
-- IPアドレスの抽出
SELECT REGEXP_EXTRACT('127.0.0.1', '(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})') AS ip_address;
URLの抽出
-- URLの抽出
SELECT REGEXP_EXTRACT('https://www.example.com', '((https|http)://[\w-]+(\.\w{2,})+)') AS url;
説明
上記のサンプルコードは、MariaDBで正規表現を使用して文字列から情報を抽出する例です。それぞれのコードは、以下の処理を行います。
- 電話番号の抽出とマスク処理:
REGEXP_EXTRACT
関数を使用して、入力文字列から最初の電話番号を抽出します。REGEXP_REPLACE
関数を使用して、抽出された電話番号部分を***
に置き換えます。
MariaDBで文字列から正規表現キャプチャグループを抽出するその他の方法
サブストリング関数と正規表現
SUBSTRING
関数とREGEXP
関数を使用して、正規表現にマッチする部分文字列を抽出することができます。構文は以下の通りです。
SUBSTRING(string, POS(string, regexp), LENGTH(REGEXP_SUBSTR(string, regexp)))
SELECT SUBSTRING('電話番号は090-1234-5678です。', POS('電話番号は090-1234-5678です。', '(\d{3}-\d{3}-\d{4})'), LENGTH(REGEXP_SUBSTR('電話番号は090-1234-5678です。', '(\d{3}-\d{3}-\d{4})'))) AS phone_number;
MATCH_AGAINST関数と全文検索
MariaDB 10.2以降では、MATCH_AGAINST
関数を使用して全文検索を実行することができます。この関数は、正規表現だけでなく、ブール値論理を使用して検索条件を指定することができます。構文は以下の通りです。
SELECT MATCH(string, AGAINST(regexp IN BOOLEAN MODE)) AS score, MATCH_AGAINST(string, AGAINST(regexp IN BOOLEAN MODE)) AS matched_text
FROM your_table;
SELECT MATCH_AGAINST('電話番号は090-1234-5678です。', AGAINST('(\d{3}-\d{3}-\d{4}) IN BOOLEAN MODE')) AS matched_text;
ユーザー定義関数
複雑な正規表現処理や、複数の正規表現を組み合わせた処理が必要な場合は、ユーザー定義関数を作成することができます。
CREATE FUNCTION extract_phone_number(input TEXT) RETURNS TEXT
BEGIN
DECLARE phone_number VARCHAR(20);
SET phone_number = REGEXP_EXTRACT(input, '(\d{3}-\d{3}-\d{4})');
IF phone_number IS NULL THEN
RETURN NULL;
END IF;
RETURN phone_number;
END;
SELECT extract_phone_number('電話番号は090-1234-5678です。');
この関数は、入力文字列から最初の電話番号を抽出し、それを返します。
外部ライブラリの利用
MariaDBは、正規表現処理に特化した外部ライブラリをいくつかサポートしています。例えば、PCRE
ライブラリを使用することで、より複雑な正規表現処理を行うことができます。
SET @pattern = '(\d{3}-\d{3}-\d{4})';
SELECT pcre_match(@pattern, '電話番号は090-1234-5678です。');
このクエリは、入力文字列に 090-1234-5678
という電話番号が含まれているかどうかを判定します。
MariaDBで文字列から正規表現キャプチャグループを抽出するには、様々な方法があります。それぞれの方法には、それぞれ利点と欠点があります。目的に合わせて適切な方法を選択することが重要です。
mariadb