スプレッドシートで「住所から都道府県だけ取り出したい」「メールアドレスの@以降を抜き出したい」と思ったことはありませんか? MID関数とFIND関数を組み合わせれば文字の位置指定で抽出できます。でも、文字数がバラバラなデータには対応しきれないのが現実です。
REGEXEXTRACT関数を使えば、正規表現のパターンに一致する部分だけをピンポイントで抽出できます。この記事ではREGEXEXTRACT関数の基本から実務パターンまで丁寧に解説しますね。
REGEXEXTRACT関数とは?正規表現で文字列を抽出する関数
REGEXEXTRACT関数は、セルの文字列から正規表現パターンに一致する部分を抽出して返す関数です。読み方は「レジェックスエクストラクト」。「Regex(正規表現)」+「Extract(抽出)」が語源です。
たとえば「tanaka@example.com」から @(.+) のパターンで抽出すると「example.com」が返ります。@以降のドメイン部分だけを取り出せるわけです。
REGEXEXTRACT関数はGoogleスプレッドシート独自の関数で、Excelには存在しません。Excelで同じことをするにはVBAが必要です。スプレッドシートなら関数だけで正規表現抽出ができるのが大きな強みですよ。
「正規表現」って何?
正規表現とは、文字列のパターンを記号で表すルールです。たとえば [0-9]+ は「1文字以上の数字」を意味します。最初はとっつきにくく感じるかもしれません。でも、よく使うパターンは決まっています。この記事で紹介するパターンをコピーして使えばOKです。正規表現の記号一覧はREGEXMATCH関数の記事でまとめていますので、そちらも参考にしてください。
REGEXEXTRACT関数の書き方(構文と引数)
基本構文
=REGEXEXTRACT(テキスト, 正規表現)
| 引数 | 必須/省略可 | 説明 |
|---|---|---|
| テキスト | 必須 | 抽出元の文字列またはセル参照 |
| 正規表現 | 必須 | 抽出したいパターンの正規表現 |
戻り値はパターンに一致した文字列です。一致する部分がなければ#N/Aエラーになります。
キャプチャグループ(括弧)の使い方
REGEXEXTRACT関数の正規表現に括弧 () を使うと、括弧内に一致した部分だけを返します。これを「キャプチャグループ」と呼びます。
=REGEXEXTRACT("tanaka@example.com", "@(.+)")
→ "example.com"(@の後ろだけを抽出)
=REGEXEXTRACT("tanaka@example.com", ".+@(.+)")
→ "example.com"(同じ結果)
=REGEXEXTRACT("tanaka@example.com", "(.+)@")
→ "tanaka"(@の前だけを抽出)
括弧なしの場合はパターン全体に一致した文字列を返します。括弧ありの場合は括弧内の部分だけを返します。この違いがポイントですよ。
REGEXEXTRACT関数の基本的な使い方
数字だけを抽出する
セルA2に「商品コード: ABC-123」が入っているとします。
=REGEXEXTRACT(A2, "[0-9]+") → "123"(数字部分を抽出)
=REGEXEXTRACT(A2, "[A-Z]+") → "ABC"(英大文字部分を抽出)
[0-9]+ は「1文字以上の数字」を意味します。最初に一致した部分が返ります。
特定のパターンを抽出する
セルA2に「受付番号: ORD-2024-0456」が入っているとします。
=REGEXEXTRACT(A2, "ORD-d{4}-d{4}")
→ "ORD-2024-0456"(注文番号パターンを抽出)
d{4} は「数字がちょうど4桁」を意味します。パターン全体に一致する文字列がそのまま返ります。
複数のキャプチャグループで分割抽出する
括弧を複数使うと、それぞれのグループが別々のセルに展開されます。
セルA2に「山田太郎 03-1234-5678」が入っているとします。
=REGEXEXTRACT(A2, "(.+)s(d{2,4}-d{1,4}-d{3,4})")
→ "山田太郎" と "03-1234-5678" が隣り合う2つのセルに展開
名前と電話番号を一度に分割できるのが便利ですね。複数グループの結果は横方向のセルに出力されます。
大文字・小文字を区別せずに抽出する
REGEXEXTRACT関数はデフォルトで大文字と小文字を区別します。区別せずに抽出したいときは (?i) を先頭に付けます。
=REGEXEXTRACT("Hello World", "(?i)hello")
→ "Hello"(大文字小文字を無視してマッチ・抽出)
実務で使えるパターン集
メールアドレスからドメインを抽出する
顧客リストのメールアドレスからドメイン部分だけを取り出します。
=REGEXEXTRACT(A2, "@(.+)")
| セルの値 | 結果 | 説明 |
|---|---|---|
| tanaka@example.com | example.com | @以降を抽出 |
| sato@company.co.jp | company.co.jp | @以降を抽出 |
| info@test.org | test.org | @以降を抽出 |
ドメイン別に顧客を集計したいときに便利です。COUNTIF関数と組み合わせれば、ドメイン別の件数集計もできます。
URLからドメイン名を抽出する
Webサイトの一覧からドメイン名だけを取り出します。
=REGEXEXTRACT(A2, "https?://([^/]+)")
| セルの値 | 結果 |
|---|---|
| https://www.example.com/page | www.example.com |
| http://blog.test.jp/article/123 | blog.test.jp |
https?:// は「httpまたはhttps」を意味します。([^/]+) は「スラッシュ以外の文字が1文字以上」です。
住所から都道府県を抽出する
住所データから都道府県名だけを取り出します。
=REGEXEXTRACT(A2, "^(.{2,3}[都道府県])")
| セルの値 | 結果 |
|---|---|
| 東京都渋谷区神南1-2-3 | 東京都 |
| 神奈川県横浜市西区 | 神奈川県 |
| 大阪府大阪市北区 | 大阪府 |
| 北海道札幌市中央区 | 北海道 |
.{2,3} は「任意の文字が2〜3文字」を意味します。「東京(2文字)」から「神奈川(3文字)」まで対応できます。
電話番号からエリアコードを抽出する
電話番号の先頭部分(エリアコード)だけを取り出します。
=REGEXEXTRACT(A2, "^(0d{1,4})")
| セルの値 | 結果 |
|---|---|
| 03-1234-5678 | 03 |
| 090-1234-5678 | 090 |
| 0120-123-456 | 0120 |
IFERROR関数と組み合わせてエラーを回避する
REGEXEXTRACT関数はパターンに一致しないと#N/Aエラーを返します。IFERROR関数で囲めばエラーを回避できます。
=IFERROR(REGEXEXTRACT(A2, "@(.+)"), "ドメインなし")
パターンに一致しないセルには「ドメインなし」と表示されます。一覧表で使うときは必ずIFERRORで囲むのがおすすめですよ。
ARRAYFORMULA関数と組み合わせて一括抽出する
ARRAYFORMULA関数と組み合わせれば、複数行を一括で処理できます。
=ARRAYFORMULA(IFERROR(REGEXEXTRACT(A2:A100, "@(.+)"), ""))
この数式をB2セルに1つ入れるだけで、A2からA100までのメールアドレスからドメインを一括抽出できます。
よくあるエラーと対処法
| エラー | 原因 | 対処法 |
|---|---|---|
| #N/A | パターンに一致する部分がない | IFERRORで囲む。正規表現の見直しも確認 |
| #VALUE! | テキストが数値 | =REGEXEXTRACT(TEXT(A2,"0"), "パターン") で文字列に変換 |
| #VALUE! | テキストが空セル | =IF(A2="", "", REGEXEXTRACT(A2, "パターン")) で空チェック |
| #REF! | 正規表現の構文エラー | 括弧の閉じ忘れ・エスケープ漏れを確認 |
数値セルで#VALUE!エラーになるケース
REGEXEXTRACT関数の第1引数は文字列が必要です。セルに数値が入っている場合は#VALUE!エラーです。
=REGEXEXTRACT(A2, "d+") → A2が数値だと #VALUE!
=REGEXEXTRACT(TEXT(A2, "0"), "d+") → TEXT関数で文字列に変換すればOK
数値から一部を抽出したい場合は、TEXT関数で文字列に変換してから渡しましょう。
パターン不一致で#N/Aエラーになるケース
REGEXMATCH関数はパターン不一致でFALSEを返します。一方、REGEXEXTRACT関数は#N/Aエラーを返します。
=REGEXEXTRACT("abc", "d+") → #N/A(数字が含まれない)
一覧表で使うときは =IFERROR(REGEXEXTRACT(A2, "パターン"), "") のようにIFERRORで囲むのが定番です。
MID+FIND関数との比較
文字列の抽出はMID関数とFIND関数の組み合わせでもできます。REGEXEXTRACTとの違いを比較しましょう。
同じ処理を両方で書いてみる
メールアドレス「tanaka@example.com」から@以降を抽出する場合です。
MID+FIND関数の場合:
=MID(A2, FIND("@", A2)+1, LEN(A2)-FIND("@", A2))
REGEXEXTRACT関数の場合:
=REGEXEXTRACT(A2, "@(.+)")
REGEXEXTRACT関数のほうがシンプルですね。MID+FINDは「@の位置を探す→その後ろから末尾までを取る」と2段階の計算が必要です。
比較表
| 比較項目 | REGEXEXTRACT | MID + FIND |
|---|---|---|
| 数式の長さ | 短い | 長い(3関数の組み合わせ) |
| パターン抽出 | 得意(正規表現で柔軟) | 苦手(固定位置のみ) |
| 可変長データ | 対応できる | 文字数計算が必要 |
| 複数パターン | 1つの数式で対応 | 複数のFINDが必要 |
| Excel互換 | なし(Sheets独自) | あり |
| 学習コスト | 正規表現の知識が必要 | 低い |
どちらを使うべき?
- 固定位置から切り出す(左から3文字、5文字目から8文字)→ MID関数・LEFT関数・RIGHT関数で十分
- パターンで抽出する(メールのドメイン、URLのパス)→ REGEXEXTRACT関数一択
- Excelとの互換性が必要 → MID + FINDを使う
データの形式がバラバラなときほど、REGEXEXTRACT関数の威力を発揮します。
REGEXMATCH・REGEXREPLACEとの使い分け
スプレッドシートには正規表現を使う関数が3つあります。目的で使い分けましょう。
| 関数 | 目的 | 戻り値 | 使用例 |
|---|---|---|---|
| REGEXMATCH | パターンに一致するか判定 | TRUE / FALSE | 入力チェック、条件分岐 |
| REGEXEXTRACT | パターンに一致する部分を抽出 | 一致した文字列 | ドメイン抽出、番号取り出し |
| REGEXREPLACE | パターンに一致する部分を置換 | 置換後の文字列 | ハイフン除去、書式統一 |
具体例で比較
セルA2に「注文番号: ORD-2024-0123」が入っているとします。
=REGEXMATCH(A2, "ORD-d{4}-d{4}")
→ TRUE(注文番号パターンに一致するか判定)
=REGEXEXTRACT(A2, "ORD-d{4}-d{4}")
→ "ORD-2024-0123"(注文番号部分を抽出)
=REGEXREPLACE(A2, "ORD-", "")
→ "注文番号: 2024-0123"(「ORD-」を除去)
判定はREGEXMATCH、抽出はREGEXEXTRACT、置換はREGEXREPLACEと覚えておきましょう。
まとめ
REGEXEXTRACT関数は、正規表現でパターンに一致する部分を抽出できるスプレッドシート独自の関数です。
- 基本:
=REGEXEXTRACT(テキスト, 正規表現)で一致部分を返す - キャプチャグループ: 括弧
()で囲んだ部分だけを抽出できる - 実務活用: ドメイン抽出・都道府県抽出・番号分解に最適
- エラー対策: パターン不一致は#N/Aエラー。IFERRORで囲むのが定番
- 使い分け: 判定はREGEXMATCH、抽出はREGEXEXTRACT、置換はREGEXREPLACE
MID+FINDでは書ききれないパターン抽出が必要なとき、ぜひ活用してみてください。正規表現の基本はREGEXMATCH関数の記事でまとめています。そちらも合わせてチェックしてみてくださいね。
