エクセルの REGEX 関数は、「正規表現」というパターンで文字を探す関数です。REGEXTEST(含むか調べる)・REGEXEXTRACT(取り出す)・REGEXREPLACE(置き換える)の 3 つがあります。「数字 2〜4 けた-4 けた-4 けた」のような形で探せるので、FIND や MID では書きにくかった「電話番号だけ取り出す」が 1 つの式でできます。
この記事では、よく使うパターンと 3 つの関数の使い方を、実際の Excel で確かめた結果で説明します。REGEX 関数は Microsoft 365 の新しい関数です。
REGEX 関数(3 つ)の書き方
=REGEXTEST(文字列, パターン, [大文字小文字])
=REGEXEXTRACT(文字列, パターン, [返す形], [大文字小文字])
=REGEXREPLACE(文字列, パターン, 置き換える文字, [何番目], [大文字小文字])
| パターンの書き方 | 意味 |
|---|---|
\d | 数字 1 文字(0〜9) |
\d{4} | 数字 4 文字 |
\d{2,4} | 数字 2〜4 文字 |
\d+ | 数字が 1 文字以上続いたところ |
[A-Z] | 英大文字 1 文字 |
[^0-9] | 数字以外の 1 文字 |
^・$ | 先頭・末尾 |
( ) | まとまり(REGEXEXTRACT で取り出す部分) |
上の表は、パターンでよく使う書き方です。\d{2,4}-\d{4}-\d{4} なら「数字 2〜4 文字、ハイフン、数字 4 文字、ハイフン、数字 4 文字」で、電話番号の形になります。
日本語の Excel では、\ がセルの中で「¥」と表示されます。入力はキーボードの「¥」キーで大丈夫です(同じ文字として扱われます)。この記事の画像でも、セルの中は ¥d、数式バーは \d と見えています。
1. 電話番号を含むか調べる(REGEXTEST)
REGEXTEST は、パターンに合う部分があれば TRUE、無ければ FALSE を返します。範囲を渡すと、行ごとの結果が並びます。
=REGEXTEST(A2:A7,"\d{2,4}-\d{4}-\d{4}")

結果は上から FALSE・TRUE・TRUE・FALSE・FALSE・TRUE でした。「品番 ABC-77」のように、ハイフンがあっても形が違えば FALSE になります。COUNTIF のワイルドカード(*)では「数字が 4 けた」のような指定はできないので、ここが REGEX の強みです。
2. 文の中から電話番号だけ取り出す(REGEXEXTRACT)
REGEXEXTRACT は、パターンに合った部分を取り出します。見つからない行は #N/A になるので、IFERROR で空欄にしています。
=IFERROR(REGEXEXTRACT(A2:A7,"\d{2,4}-\d{4}-\d{4}"),"")

「電話 03-1234-5678 まで」から「03-1234-5678」、「TEL:090-9876-5432」から「090-9876-5432」が取り出せました。番号の前後の文字や長さがばらばらでも、形で探すので 1 つの式で済みます。
3. 数字のかたまりを全部取り出す
3 つ目の返す形を 1 にすると、合う部分を全部、横に並べて返します(0 または省略で最初の 1 つだけ)。
=REGEXEXTRACT(A3,"\d+",1)

A3 の「電話 03-1234-5678 まで」から「03」「1234」「5678」の 3 つが、別々のセルに入りました。
4. 数字だけを残す(REGEXREPLACE)
REGEXREPLACE は、パターンに合う部分を別の文字に置き換えます。[^0-9](数字以外)を空の文字 "" に置き換えると、数字だけが残ります。
=REGEXREPLACE(A2:A7,"[^0-9]","")

「TEL:090-9876-5432」は「09098765432」に、「品番 ABC-77 を 3 個」は「773」になりました。離れた数字(77 と 3)もつながってしまうので、数字のかたまりを分けたいときは前の REGEXEXTRACT の返す形 1 を使います。数字の無い「連絡なし」は空欄です。結果は文字列なので、計算に使うときは -- や VALUE で数値にします。ほかの方法は 数字だけ・文字だけを取り出す方法で説明しています。
【実機で検証】REGEX でつまずくところ

| ためしたこと | 式 | 結果 |
|---|---|---|
| 大文字・小文字(そのまま) | =REGEXTEST("Excel","excel") | FALSE |
| 大文字・小文字を区別しない(3 つ目に 1) | =REGEXTEST("Excel","excel",1) | TRUE |
| 全角の数字は \d に合うか | =REGEXTEST("123","\d") | TRUE |
| 全角の数字は [0-9] に合うか | =REGEXTEST("123","[0-9]") | FALSE |
| 見つからないときの REGEXEXTRACT | =REGEXEXTRACT("連絡なし","\d+") | #N/A |
| ( ) で 2 つに分けて取り出す(返す形 2) | =TEXTJOIN("/",,REGEXEXTRACT("A-1023","([A-Z]+)-(\d+)",2)) | A/1023 |
| 2 番目に合う所だけ置き換え | =REGEXREPLACE("1-2-3","\d","X",2) | 1-X-3 |
REGEX 関数は大文字と小文字を区別します。「Excel」に「excel」を探すと FALSE で、3 つ目に 1 を入れると TRUE になりました。
全角の「123」は \d には合い(TRUE)、[0-9] には合いませんでした(FALSE)。半角の数字だけを探したいときは [0-9] と書きます。全角・半角がまざる表では、先に ASC 関数で半角にそろえると確実です。
見つからないときの REGEXEXTRACT は #N/A になりました。返す形を 2 にすると、( ) で囲んだ部分ごとに取り出せ、「A-1023」は「A/1023」に分かれました。REGEXREPLACE の 4 つ目に 2 を入れると、2 番目に合う所だけが置き換わり「1-X-3」になりました。
よくある質問
REGEX 関数が使えない(#NAME?)ときは?
REGEXTEST・REGEXEXTRACT・REGEXREPLACE は Microsoft 365 の新しい関数です。Excel 2021 以前では使えないので、FIND・MID・SUBSTITUTE を組み合わせます。
「含む」だけなら COUNTIF と何が違う?
決まった文字を含むかだけなら COUNTIF の "*文字*" で十分です。「数字が 4 けた」「英字のあとに数字」のような形で探したいときに REGEX を使います。
. や ( を文字として探すには?
. や ( は正規表現で特別な意味があるので、前に \ を付けて \.・\( と書きます。

コメント