08R 第3部 実践 / 効果的な「型」を持つ

正規表現 完全ガイド(RE2)

Googleスプレッドシートの正規表現(RE2)をゼロからステップバイステップで解説。REGEXMATCH/REGEXEXTRACT/REGEXREPLACEの使い方、メタ文字・文字クラス・量指定子・アンカー・グループの全記号を網羅した一覧表と、実務でそのまま使える便利なパターン集(判定・抽出・置換)、RE2に「無い機能」の正しい回避法までまとめた決定版。

読了 約20分 最終更新 2026.06 正規表現REGEXRE2REGEXEXTRACTREGEXMATCHREGEXREPLACEパターン

正規表現(regex)は「文字列の検索パターンを書くための小さな言語」です。 「数字だけか判定したい」「文中からメールアドレスを抜き出したい」「記号を一括で消したい」——こうした“位置が決まっていない文字列の処理”は、LEFTSUBSTITUTE だけでは手に負えません。そこで使うのが正規表現です。本章は 正規表現をまったく知らない人でも、読み切れば Google スプレッドシートで使える正規表現のすべてが分かる ように、ゼロから順を追って解説します。最後に 全記号の一覧表そのまま貼れる便利パターン集 を置きました。

正規表現は、次の3つの関数で使います。まずはこの3つが「入り口」だと押さえてください。

関数返すものひとことで言うと
REGEXMATCH(文字列, 正規表現)TRUE / FALSEパターンに合うか 判定 する
REGEXEXTRACT(文字列, 正規表現)一致した文字列パターンに合う部分を 取り出す
REGEXREPLACE(文字列, 正規表現, 置換)置換後の文字列合う箇所を すべて置換 する

ステップ0:3つの関数と「既定のふるまい」

記号を覚える前に、3関数に共通する 既定のふるまい を押さえます。これを知らないと、結果が「なぜそうなるのか」が読めません。

  • 部分一致が既定:パターンは文字列の どこかに見つかれば一致 します(先頭から全体が一致する必要はない)。「全体がパターンと一致するか」を見たいときは、後述の ^…$ で挟みます。
  • 大文字・小文字を区別する:既定では Aa は別物。無視したいときは先頭に (?i) を付けます(後述)。
  • .(任意の1文字)は改行に一致しない(既定)。
  • REGEXREPLACE は全置換:「最初の1つだけ置換」というオプションはありません。1か所だけにしたいなら、その箇所を特定できるパターンにします。
  • REGEXEXTRACT は一致が無いと #N/A:混在データでは、先に REGEXMATCH でふるい分けるか IFERROR で包むのが安全です。
まず動かしてみる
=REGEXMATCH("売上1200円", "\d+")TRUE(数字が含まれる)
=REGEXEXTRACT("売上1200円", "\d+")1200(数字のかたまりを取り出す)
=REGEXREPLACE("売上1200円", "\d+", "★")売上★円(数字を置換)

この3つは 同じパターン \d+(数字1個以上)を、判定・抽出・置換のどれに使うか が違うだけです。つまり「パターンの書き方」さえ覚えれば、3関数すべてに通用します。以降はその「パターンの書き方」を5つの部品に分けて学びます。

ステップ1:リテラルとメタ文字(特別な意味を持つ記号)

ほとんどの文字は そのままその文字 に一致します( は「猫」に一致、5 は「5」に一致)。これを リテラル と呼びます。一方、次の記号は 特別な意味(メタ文字) を持ち、そのままでは「文字そのもの」になりません。

.  ^  $  *  +  ?  (  )  [  ]  {  }  |  \

これらを 文字そのもの として一致させたいときは、直前に \(バックスラッシュ)を付けて エスケープ します。

エスケープ:メタ文字を“ただの文字”にする
\. → ピリオド「.」そのものに一致(. のままだと“任意の1文字”の意味になる)
\$ → 「$」記号そのもの / \( → 「(」そのもの / \\ → 「\」そのもの
=REGEXMATCH("3.14", "3.14")TRUE だが、これは「3・任意の1文字・14」の意味。"3\.14" と書くのが正確

ステップ2:文字クラス — 「1文字」が何にあたるか

[ ] で囲むと「この中のどれか1文字」を表します(文字クラス)。よく使う略記もあります。「1文字ぶん」を表す部品 だと意識してください。

書き方意味
[abc]a・b・c のいずれか1文字[gj]ood は good か jood
[a-z] [0-9]範囲指定(小文字英字/数字のいずれか1文字)[A-Za-z] で英字1文字
[^0-9]否定:数字以外の1文字(^ が先頭にあると「以外」)[^aeiou] は母音以外
.任意の1文字(改行を除く)a.c は abc, a5c など
\d \D数字 [0-9] / 数字以外\d\d は数字2つ
\w \W英数字とアンダースコア [0-9A-Za-z_] / それ以外ユーザー名など
\s \S空白(スペース・タブ・改行等)/ 空白以外\s+ で連続空白
[[:alpha:]] [[:digit:]] [[:alnum:]] [[:space:]]POSIX クラス(英字/数字/英数字/空白)。[ ] の中に入れて使う[[:digit:]]+ は数字列

ステップ3:量指定子 — 「何回くり返すか」

直前の1文字(または文字クラス・グループ)が 何回くり返されるか を指定します。

書き方意味
*0回以上\d* は数字0個以上
+1回以上\d+ は数字1個以上
?0回または1回(任意)-? はハイフンが有っても無くても可
{n}ちょうど n 回\d{4} は数字ちょうど4個
{n,}n 回以上\d{3,} は数字3個以上
{n,m}n〜m 回\d{2,4} は数字2〜4個

量指定子は既定で できるだけ多く 一致しようとします(貪欲/greedy)。末尾に ? を付けると できるだけ少なく控えめ/lazy)になります:*? +? ?? {n,m}?。この違いは抽出で結果が変わるため重要です。

貪欲と控えめの違い(重要)

文字列 <a><b> に対して……
=REGEXEXTRACT("<a><b>", "<.*>")<a><b>(貪欲。最後の > まで伸びる)
=REGEXEXTRACT("<a><b>", "<.*?>")<a>(控えめ。最初の > で止まる)

ステップ4:アンカーと境界 — 「位置」を指定する

文字ではなく 位置 に一致する記号です。文字数を消費しません(「ここ」という目印)。

書き方意味
^文字列(行)の先頭
$文字列(行)の末尾
\b単語の境界(語と非語の境目)
\B単語の境界 でない 位置
\A \zテキスト全体の先頭/末尾

いちばん使うのは ^$ です。この2つで挟むと「全体一致」 になり、部分一致の緩さを締められます。

全体一致にするには ^ と $ で挟む
=REGEXMATCH(A2, "^\d{7}$") → 「全体が数字ちょうど7桁」のときだけ TRUE(郵便番号の厳密チェック)
=REGEXMATCH(A2, "\d{7}") → 文中のどこかに7桁数字があれば TRUE(部分一致なので緩い。“abc1234567xyz” でも TRUE)

ステップ5:グループ () と選択 |

( ) で囲むと、複数の文字を ひとかたまり として扱えます。さらに キャプチャ(捕捉) され、後で取り出し・参照できます。

書き方意味
(…)グループ化+キャプチャ(左から1番、2番…と番号が付く)
(?:…)グループ化のみ(キャプチャしない=番号を消費しない)
(?P<name>…) / (?<name>…)名前付きグループ(RE2 はどちらの表記も有効。ただし Sheets の関数は名前で取り出せず番号で扱う ため、実用上は通常の (…) で十分)
A|BA または B(選択/alternation)。(株|有限)会社 で「株会社」か「有限会社」

グループは「量指定子をまとめてかける」ときにも必須です。(ab)+ は “ab” の1回以上(“ababab”)、ab+ は “a” のあと “b” が1回以上(“abbb”)——カッコの有無で意味がまったく変わります

キャプチャグループは、REGEXEXTRACTREGEXREPLACE で活きます。

  • REGEXEXTRACT:グループが 無ければ一致部分全体1個ならその中身複数あれば各グループを横のセルに展開 します。
  • REGEXREPLACE の置換文字列$0 が一致全体、$1 $2… が各グループ。RE2 のバックスラッシュ記法ではなく、ドル記号 $ を使います(Google スプレッドシート仕様)。
グループの実例
=REGEXEXTRACT("2026-06-03", "(\d{4})-(\d{2})-(\d{2})")2026 06 03 を3つのセルに展開
=REGEXREPLACE("01/15/2026", "(\d{2})/(\d{2})/(\d{4})", "$3-$1-$2")2026-01-15(順序を入れ替え)
=REGEXEXTRACT("田中 太郎", "(\S+)\s+(\S+)")田中 太郎(姓と名に分割)

ステップ6:大文字小文字を無視する (?i) とインラインフラグ

既定では大文字小文字を区別します。パターンの先頭(?i) を置くと、その正規表現全体が 大文字小文字を無視 します。

(?i) で大小無視
=REGEXMATCH("APPLE", "(?i)apple")TRUE(“Apple” でも “apple” でも一致)
=REGEXMATCH("APPLE", "apple")FALSE(既定は区別する)
apple(?i) のように後ろに置くのは誤り。フラグは 先頭 に置く。

RE2 にはこのほか次のインラインフラグがあり、いずれも (?フラグ) の形で 先頭 に書きます。実務でいちばん使うのは (?i) です。

フラグ効果
(?i)大文字小文字を無視
(?m)複数行モード。^ $各行 の先頭・末尾に一致させる
(?s).改行にも 一致させる(既定では改行に一致しない)
(?U)貪欲と控えめを入れ替える(* が控えめ、*? が貪欲になる)

ステップ7:RE2 に「無いもの」— ここを絶対に間違えない

正規表現でつまずく最大の原因が、他のエンジン(PCRE など)にはあるが RE2 には無い機能 を使ってしまうことです。次は すべて非対応 で、書くとエラー(#ERROR! など)になります(RE2公式 が “(NOT SUPPORTED)” と明記)。

使えない機能書き方の例代わりにどうするか
先読み(lookahead)(?=…) (?!…)条件を本体パターンに組み込むか、REGEXMATCHAND/IF で併用して判定を分ける
後読み(lookbehind)(?<=…) (?<!…)直前の文字もグループに含めて取り、$1 等で復元する
後方参照(パターン内)(\w)\1(同じ文字の連続 等)RE2 では表現不可。REGEXEXTRACT で取った値を別途 =A2=B2 等で比較
原子グループ/絶対最大量指定子(?>…) a++通常のグループ (…) ・量指定子で代替
テキスト末尾 \Z(大文字)…\ZRE2 は \z(小文字)が末尾。\Z は使えない

全記号 早見表(リファレンス)

ここまでの記号を1枚にまとめました。困ったらここに戻ってください。

メタ文字・エスケープ

記号意味
.任意の1文字(改行を除く。(?s) で改行も)
\次の文字をエスケープ/特殊シーケンスの開始
\\ \. \( \[ \{ \* \+ \? | \$ \^それぞれの記号そのもの
\t \n \rタブ/改行/復帰

文字クラス(1文字ぶん)

記号意味
[…] / [^…]いずれか1文字 / それ以外の1文字
a-z 0-9(クラス内)範囲
\d \D数字(ASCII)/ 数字以外
\w \W[0-9A-Za-z_] / それ以外
\s \S空白 / 空白以外
[[:alpha:]] [[:digit:]] [[:alnum:]] [[:upper:]] [[:lower:]] [[:space:]]POSIX クラス
[ぁ-ん] [ァ-ン] [一-龯] [0-9] [A-Z]日本語・全角の範囲指定

量指定子(くり返し)

記号意味
* + ?0回以上 / 1回以上 / 0か1回
{n} {n,} {n,m}ちょうどn / n以上 / n〜m
*? +? ?? {n,m}?控えめ(最小一致)版

アンカー・グループ・選択・フラグ

記号意味
^ $行頭 / 行末
\b \B単語境界 / 非境界
\A \zテキスト先頭 / 末尾
(…) (?:…)キャプチャ / 非キャプチャ
(?P<n>…) (?<n>…)名前付きキャプチャ
A|B選択(A または B)
(?i) (?m) (?s) (?U)大小無視 / 複数行 / ドットが改行も / 貪欲反転
$0 $1 $2…(置換文字列)一致全体 / 各グループ

便利な正規表現の型(パターン集)

そのまま REGEXMATCH / REGEXEXTRACT / REGEXREPLACE に貼れる実務レシピです。すべて RE2/Google スプレッドシートで動作 します。

判定する(REGEXMATCH)

やりたいこと正規表現使い方の例
数字だけか^\d+$=REGEXMATCH(A2, "^\d+$")
半角英数字だけか^[A-Za-z0-9]+$=REGEXMATCH(A2, "^[A-Za-z0-9]+$")
ひらがなだけか^[ぁ-ん]+$=REGEXMATCH(A2, "^[ぁ-ん]+$")
メールの形式か^[\w.+-]+@[\w.-]+\.\w+$=REGEXMATCH(A2, "^[\w.+-]+@[\w.-]+\.\w+$")
郵便番号(厳密7桁)^\d{3}-?\d{4}$=REGEXMATCH(A2, "^\d{3}-?\d{4}$")
特定語を含むか(大小無視)(?i)error=REGEXMATCH(A2, "(?i)error")
いずれかの語を含むか緊急|至急|重要=REGEXMATCH(A2, "緊急|至急|重要")

取り出す(REGEXEXTRACT)

やりたいこと正規表現使い方の例
文中の数字のかたまり\d+=REGEXEXTRACT(A2, "\d+")
小数(符号つき可)-?\d+(\.\d+)?=REGEXEXTRACT(A2, "-?\d+(\.\d+)?")
メールアドレス[\w.+-]+@[\w.-]+\.\w+=REGEXEXTRACT(A2, "[\w.+-]+@[\w.-]+\.\w+")
URLhttps?://[\w./%#?=&-]+=REGEXEXTRACT(A2, "https?://[\w./%#?=&-]+")
ドメインだけ(@の後ろ)@([\w.-]+)=REGEXEXTRACT(A2, "@([\w.-]+)") → グループ1がドメイン
年月日を3分割(\d{4})-(\d{2})-(\d{2})=REGEXEXTRACT(A2, "(\d{4})-(\d{2})-(\d{2})")
カッコ内の文字\((.*?)\)=REGEXEXTRACT(A2, "\((.*?)\)") → グループ1が中身
末尾の拡張子\.(\w+)$=REGEXEXTRACT(A2, "\.(\w+)$")

置換する(REGEXREPLACE)

やりたいこと正規表現置換使い方の例
数字以外を全部消す[^0-9]""=REGEXREPLACE(A2, "[^0-9]", "")
連続空白を1つに\s+" "=REGEXREPLACE(A2, "\s+", " ")
前後の空白を除去^\s+|\s+$""=REGEXREPLACE(A2, "^\s+|\s+$", "")
記号類を除去[-()\s]""=REGEXREPLACE(A2, "[-()\s]", "")
日付の区切りを統一[./]"-"=REGEXREPLACE(A2, "[./]", "-")
桁を入れ替える(M/D/Y→Y-M-D)(\d+)/(\d+)/(\d+)"$3-$1-$2"=REGEXREPLACE(A2, "(\d+)/(\d+)/(\d+)", "$3-$1-$2")
全角スペースを半角に " "=REGEXREPLACE(A2, " ", " ")

つまずきポイントと、直し方

動かない①

ネットの正規表現が #ERROR!

先読み (?=)・後読み (?<=)・後方参照 \1\p{…} を使っていないか確認。RE2 では非対応です。代替はステップ7を参照。

動かない②

日本語が \w で拾えない

\w \d は ASCII 限定。日本語は .[ぁ-ん] などの 文字コード範囲 で。

広すぎ/狭すぎ

抽出が想定とずれる

貪欲 .* が伸びすぎるときは控えめ .*? に。逆に足りないときは文字クラスを広げる。^…$ で全体一致に締めるのも有効。