REGEXEXTRACT関数の使い方|正規表現で必要な部分だけ取り出す

執筆者:

カテゴリ:

REGEXEXTRACTは、正規表現を使って、文字列から必要な部分だけを取り出す関数です。

LEFTMID が「位置」で切り出すのに対し、REGEXEXTRACTは「パターン」で切り出します。 位置が可変のデータでは圧倒的に短く書けます。

Excelにはありません。 スプレッドシート固有の関数です。

書式

=REGEXEXTRACT(文字列, 正規表現)

正規表現は " で囲みます。

正規表現の最小限の知識

実務で使うのは、だいたいこれだけです。

記号 意味
\d 数字1文字
\D 数字以外1文字
\w 英数字とアンダースコア1文字
\s 空白1文字
. 任意の1文字
+ 直前を1回以上
* 直前を0回以上
? 直前を0回か1回
{3} 直前をちょうど3回
[abc] a か b か c
[^abc] a b c 以外
^ 先頭
$ 末尾
(...) 取り出す範囲
`\ ` または

() が最重要です。 REGEXEXTRACTは、括弧で囲んだ部分だけを返します。括弧がなければ、一致した全体を返します。

. ( ) - などを文字そのものとして扱いたいときは、前に \ を付けます(\. \()。

基本の使い方

A1 = 商品コード:ABC-1234

=REGEXEXTRACT(A1, "\d+")        → 1234
=REGEXEXTRACT(A1, "[A-Z]+")     → ABC
=REGEXEXTRACT(A1, "([A-Z]+)-")  → ABC

3つ目は「大文字の連続の後にハイフンが続く」パターンで、括弧の中(大文字部分)だけを返しています。

実用例

数字だけ取り出す

=REGEXEXTRACT(A1, "\d+")

複数箇所に数字があると、最初の1つしか返りません。全部つなげたいなら REGEXREPLACE で数字以外を消します。

=REGEXREPLACE(A1, "\D", "")

括弧の中身を取り出す

=REGEXEXTRACT(A1, "\((.+?)\)")

\(\) で括弧そのものを表し、(.+?) で中身を取り出しています。? は「最短一致」で、括弧が複数あるとき最初のペアだけを拾います。

最後の区切りより後ろ

=REGEXEXTRACT(A1, "([^/]+)$")

/ 以外の文字が末尾まで続く部分」=最後の / より後ろです。RIGHTFIND で書くと非常に長くなる処理が、これだけで済みます。

拡張子を取り出す

=REGEXEXTRACT(A1, "\.([^.]+)$")

ドメインを取り出す

=REGEXEXTRACT(A1, "https?://([^/]+)")

s? で http と https の両方に対応しています。

メールアドレスのユーザー名部分

=REGEXEXTRACT(A1, "^([^@]+)@")

日付を取り出す

=REGEXEXTRACT(A1, "\d{4}[-/]\d{1,2}[-/]\d{1,2}")

[-/] でハイフンとスラッシュの両方に対応、{1,2} で1桁も2桁も許容しています。

郵便番号を取り出す

=REGEXEXTRACT(A1, "\d{3}-?\d{4}")

複数の部分を同時に取り出す

括弧を複数書くと、横方向に複数の結果が返ります。

=REGEXEXTRACT(A1, "([A-Z]+)-(\d+)")

ABC1234 が2つのセルに展開されます。右隣を空けておいてください。

1つだけ欲しいなら INDEX で選びます。

=INDEX(REGEXEXTRACT(A1, "([A-Z]+)-(\d+)"), 1, 2)

全行に適用する

ARRAYFORMULA が確実に効きます。ここが SPLIT に対する大きな利点です。

=ARRAYFORMULA(IF(A2:A="", "", REGEXEXTRACT(A2:A, "\d+")))

一致しない行があるとエラーになるので、IFERROR を挟みます。

=ARRAYFORMULA(IF(A2:A="", "", IFERROR(REGEXEXTRACT(A2:A, "\d+"), "")))

この形が実用上の基本形です。

REGEXMATCH・REGEXREPLACEとの使い分け

関数 用途
REGEXEXTRACT 取り出す
REGEXMATCH 一致するか判定する(TRUE/FALSE
REGEXREPLACE 置き換える

判定なら REGEXMATCH です。

=IF(REGEXMATCH(A1, "^\d{3}-\d{4}$"), "OK", "形式エラー")

FILTER の条件にも使えます。

=FILTER(A:C, REGEXMATCH(B:B, "東京|大阪"))

エラーの対処

#N/A が出る

パターンに一致しませんでした。 これが最も多いエラーです。

  • – 全角と半角が違う(-
  • – 対象に想定外の文字が入っている
  • – パターンの書き間違い

IFERROR で包むのが基本ですが、包む前に一致しない行を確認してください。 データの想定違いに気づくきっかけになります。

=IFERROR(REGEXEXTRACT(A1, "\d+"), "パターン外")

「パターン外」と表示しておけば、後で確認できます。

想定と違う部分が返る

  • 括弧の位置が違う。取り出したい部分だけを () で囲んでください
  • + が貪欲に一致しすぎている。+? で最短一致にしてください

#REF! が出る

複数の括弧を書いた結果の展開先に、データが入っています。

まとめ

  • – 書式は =REGEXEXTRACT(文字列, "正規表現")
  • () で囲んだ部分が返る。囲まなければ一致部分全体
  • – 覚えるのは \d + [] ^ $ () ? くらいで足りる
  • 位置が可変のデータでは MID より圧倒的に短い
  • – 全行適用は ARRAYFORMULA + IFERROR が基本形
  • – 判定は REGEXMATCH、置換は REGEXREPLACE

関連する関数

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です