【Excel】REGEXEXTRACT関数で正規表現を使って文字列を抽出する方法

この記事は約6分で読めます。

今回は、ExcelのREGEXEXTRACT関数を使って、正規表現のパターンに合う文字列をセルから抽出する方法を紹介します。

REGEXEXTRACT関数は、Microsoft 365のExcelで使える比較的新しい関数です。買い切り版のExcelや、更新が行われていない環境では利用できないことがあります。セルに「=REGEX」と入力して、関数の候補にREGEXEXTRACTが表示されるかを先に確認しておくと安心です。

REGEXEXTRACT関数でできること

REGEXEXTRACT関数は、指定した正規表現に一致する文字列を、元のテキストから取り出す関数です。LEFT関数やMID関数のように「何文字目から何文字」と位置を指定するのではなく、文字の並び方のルールで取り出す部分を決められる点が特徴です。

たとえば、次のような作業に向いています。

  • 住所の中から郵便番号の部分だけを取り出す
  • 問い合わせ内容のメモから電話番号を取り出す
  • 「AB-1234」のような商品コードを、英字部分と数字部分に分ける
  • 文章中に含まれる数字をまとめて取り出す

取り出したい文字の位置がセルごとにばらばらでも、並び方に共通のルールがあれば、同じ数式で対応できます。

REGEXEXTRACT関数の構文

構文は次のとおりです。

REGEXEXTRACT(text, pattern, [return_mode], [case_sensitivity])

  • text(必須):抽出元のテキスト、またはテキストが入ったセルの参照
  • pattern(必須):抽出したい文字列のパターンを表す正規表現
  • return_mode(省略可):どの結果を返すかを数値で指定します。0は最初に一致した文字列、1は一致したすべての文字列を配列で、2は最初の一致に含まれるキャプチャグループを配列で返します。省略すると0になります。
  • case_sensitivity(省略可):大文字と小文字を区別するかどうかを指定します。0は区別する、1は区別しない設定です。省略すると区別します。

まず覚えておきたいパターンの書き方

正規表現は、文字の種類や繰り返しを記号で表します。最初は次の基本だけでも、多くの場面に対応できます。

  • [0-9]:0から9までの任意の数字1文字
  • [a-z]:aからzまでの小文字1文字
  • [A-Z]:AからZまでの大文字1文字
  • .(ピリオド):任意の1文字
  • +:直前の文字が1回以上続く
  • *:直前の文字が0回以上続く
  • {3}:直前の文字がちょうど3回続く
  • ( ):パターンの一部をまとめるキャプチャグループ

かっこやハイフンなど、記号そのものを文字として扱いたいときは、前にバックスラッシュ(\)を付けてエスケープします。日本語環境では、バックスラッシュが円記号(¥)で表示される場合がありますが、同じ文字として扱われます。

ExcelのREGEX系関数は、PCRE2という種類の正規表現の書き方に対応しています。

REGEXEXTRACT関数の使用例

ここからは、A2セルにデータが入力されている前提で、具体的な数式を紹介します。

住所から郵便番号を抽出する

A2セルに「〒150-0001 東京都渋谷区…」のような住所が入っているとします。郵便番号は「数字3桁・ハイフン・数字4桁」という並びなので、次のように書けます。

=REGEXEXTRACT(A2,”[0-9]{3}-[0-9]{4}”)

郵便番号が文字列の先頭にあっても途中にあっても、パターンに合う部分が取り出されます。住所の書き方が人によって違う名簿でも、同じ数式をコピーして使えるのが便利な点です。

メモから電話番号を抽出する

「担当:山田 03-1234-5678(平日のみ)」のように、名前や補足と電話番号が混ざっているセルから番号だけを取り出したい場合は、次のような数式が使えます。

=REGEXEXTRACT(A2,”[0-9]+-[0-9]+-[0-9]+”)

「数字が1文字以上続き、ハイフンをはさむ」という形を3回繰り返す指定です。市外局番の桁数が異なる番号でも、+を使っているため対応できます。

一致した文字列をすべて取り出す

「注文数12、返品3、在庫45」のように、1つのセルに数字が複数含まれている場合は、return_modeに1を指定します。

=REGEXEXTRACT(A2,”[0-9]+”,1)

一致したすべての数字が配列として返され、隣のセルにスピルして表示されます。スピル先のセルに別のデータがあると結果を表示できないため、結果が広がる範囲を空けておくのがコツです。

キャプチャグループで要素を分割する

「AB-1234」のような商品コードを、英字部分と数字部分に分けたいときは、パターンをかっこで区切り、return_modeに2を指定します。

=REGEXEXTRACT(A2,”([A-Z]+)-([0-9]+)”,2)

1つ目のかっこに一致した「AB」と、2つ目のかっこに一致した「1234」が、それぞれ別のセルに返されます。TEXTSPLIT関数のように区切り文字で分ける方法と違い、取り出したい部分だけをかっこで指定できるため、前後に余分な文字がある場合にも使いやすい方法です。

大文字と小文字を区別せずに抽出する

「Item-01」「ITEM-02」「item-03」のように表記がそろっていないデータから同じ形式の文字列を取り出すときは、4番目の引数に1を指定します。

=REGEXEXTRACT(A2,”item-[0-9]+”,0,1)

この指定で、大文字・小文字の違いに関係なく一致した部分が取り出されます。

REGEXEXTRACT関数を使いこなすためのTips

抽出した数字はVALUE関数で数値に戻す

REGEXEXTRACT関数の結果は、常に文字列として返されます。見た目は数字でも、そのままでは合計や比較の計算で意図しない結果になることがあります。計算に使う場合は、VALUE関数で囲んで数値に変換します。

=VALUE(REGEXEXTRACT(A2,”[0-9]+”))

REGEXTEST関数で一致の有無を先に確かめる

セルによっては、パターンに合う文字列が含まれていないこともあります。そのような列を扱うときは、パターンに一致するかどうかを判定するREGEXTEST関数と組み合わせると、結果を整理しやすくなります。

=IF(REGEXTEST(A2,”[0-9]{3}-[0-9]{4}”),REGEXEXTRACT(A2,”[0-9]{3}-[0-9]{4}”),””)

郵便番号が含まれているセルだけ抽出し、含まれていないセルは空欄のままにできます。

パターンはセルに書いて参照する

同じパターンを多くの数式で使う場合は、パターンを別のセルに入力し、数式からそのセルを参照する方法がおすすめです。パターンを修正したくなったときに、1か所を書き換えるだけで済みます。

先頭や末尾を指定して誤抽出を防ぐ

正規表現の「^」は文字列の先頭、「$」は末尾を表します。たとえば、セル全体が決まった形式かどうかを確かめたい場合は、パターンを「^」と「$」で挟むと、途中に一致する部分があるだけのセルを除外できます。入力ルールのチェックにREGEXTEST関数と合わせて使うと便利です。

少しずつパターンを組み立てる

複雑なパターンを一度に書こうとすると、どこが原因で一致しないのかがわかりにくくなります。まず「[0-9]+」のような短いパターンで結果を確認し、そこにハイフンや桁数の指定を加えていくと、意図したとおりに動いているかを確かめながら進められます。

まとめ

REGEXEXTRACT関数を使うと、正規表現で指定したルールに合う文字列を、位置に関係なく抽出できます。

  • 基本の形は「=REGEXEXTRACT(テキスト,パターン)」
  • return_modeは、0で最初の一致、1ですべての一致、2でキャプチャグループを返す
  • 4番目の引数に1を指定すると、大文字と小文字を区別せずに抽出できる
  • 結果は文字列になるため、計算に使うときはVALUE関数で変換する
  • REGEXTEST関数と組み合わせると、一致しないセルを扱いやすくなる
  • Microsoft 365のExcelで使える関数のため、利用環境を事前に確認する

郵便番号や電話番号の抽出など、身近なデータから試していくと、正規表現の書き方にも自然と慣れていきます。