正規表現 完全ガイド(RE2)
Googleスプレッドシートの正規表現(RE2)をゼロからステップバイステップで解説。REGEXMATCH/REGEXEXTRACT/REGEXREPLACEの使い方、メタ文字・文字クラス・量指定子・アンカー・グループの全記号を網羅した一覧表と、実務でそのまま使える便利なパターン集(判定・抽出・置換)、RE2に「無い機能」の正しい回避法までまとめた決定版。
正規表現(regex)は「文字列の検索パターンを書くための小さな言語」です。 「数字だけか判定したい」「文中からメールアドレスを抜き出したい」「記号を一括で消したい」——こうした“位置が決まっていない文字列の処理”は、LEFT や SUBSTITUTE だけでは手に負えません。そこで使うのが正規表現です。本章は 正規表現をまったく知らない人でも、読み切れば Google スプレッドシートで使える正規表現のすべてが分かる ように、ゼロから順を追って解説します。最後に 全記号の一覧表 と そのまま貼れる便利パターン集 を置きました。
正規表現は、次の3つの関数で使います。まずはこの3つが「入り口」だと押さえてください。
| 関数 | 返すもの | ひとことで言うと |
|---|---|---|
REGEXMATCH(文字列, 正規表現) | TRUE / FALSE | パターンに合うか 判定 する |
REGEXEXTRACT(文字列, 正規表現) | 一致した文字列 | パターンに合う部分を 取り出す |
REGEXREPLACE(文字列, 正規表現, 置換) | 置換後の文字列 | 合う箇所を すべて置換 する |
ステップ0:3つの関数と「既定のふるまい」
記号を覚える前に、3関数に共通する 既定のふるまい を押さえます。これを知らないと、結果が「なぜそうなるのか」が読めません。
- 部分一致が既定:パターンは文字列の どこかに見つかれば一致 します(先頭から全体が一致する必要はない)。「全体がパターンと一致するか」を見たいときは、後述の
^…$で挟みます。 - 大文字・小文字を区別する:既定では
Aとaは別物。無視したいときは先頭に(?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|B | A または B(選択/alternation)。(株|有限)会社 で「株会社」か「有限会社」 |
グループは「量指定子をまとめてかける」ときにも必須です。(ab)+ は “ab” の1回以上(“ababab”)、ab+ は “a” のあと “b” が1回以上(“abbb”)——カッコの有無で意味がまったく変わります。
キャプチャグループは、REGEXEXTRACT と REGEXREPLACE で活きます。
- 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) を置くと、その正規表現全体が 大文字小文字を無視 します。
=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) | (?=…) (?!…) | 条件を本体パターンに組み込むか、REGEXMATCH を AND/IF で併用して判定を分ける |
| 後読み(lookbehind) | (?<=…) (?<!…) | 直前の文字もグループに含めて取り、$1 等で復元する |
| 後方参照(パターン内) | (\w)\1(同じ文字の連続 等) | RE2 では表現不可。REGEXEXTRACT で取った値を別途 =A2=B2 等で比較 |
| 原子グループ/絶対最大量指定子 | (?>…) a++ | 通常のグループ (…) ・量指定子で代替 |
テキスト末尾 \Z(大文字) | …\Z | RE2 は \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+") |
| URL | https?://[\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 限定。日本語は . か [ぁ-ん] などの 文字コード範囲 で。
抽出が想定とずれる
貪欲 .* が伸びすぎるときは控えめ .*? に。逆に足りないときは文字クラスを広げる。^…$ で全体一致に締めるのも有効。