タグ: REGEXEXTRACT

  • 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

    関連する関数