REGEXEXTRACTは、正規表現を使って、文字列から必要な部分だけを取り出す関数です。
LEFT や MID が「位置」で切り出すのに対し、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, "([^/]+)$")
「/ 以外の文字が末尾まで続く部分」=最後の / より後ろです。RIGHT と FIND で書くと非常に長くなる処理が、これだけで済みます。
拡張子を取り出す
=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+)")
ABC と 1234 が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
関連する関数
- – SPLIT — 区切り文字で分割する
- – MID — 位置で切り出す
- – SUBSTITUTE — 文字を置き換える
- – FILTER —
REGEXMATCHと組み合わせて絞り込む - – 関数一覧に戻る
コメントを残す