正規表現早見表 — すべてのトークンを例付きで解説

正規表現のすべてのトークンを、動作する例、JavaScript・PCRE/PHP・Python・Go・Java・.NET での対応状況、入力済みの正規表現テスターを開く「試す」リンク付きで掲載。

最終確認日:2026-10-18 に ECMAScript 2025(MDN)、PCRE2 10.45、Python 3.14 re、Go 1.27 regexp/syntax、Java 25 Pattern、.NET 正規表現リファレンス と照合。出典:MDN regular expressions, PCRE2 pattern syntax, Python re, Go regexp/syntax, Java Pattern, .NET regex quick reference。

82 件
正規表現の種類

✓ 同じ記法 · ~ 記法が異なる、または制限あり · ✗ 非対応。例は JavaScript で実行され、他の言語での記法は注記に記載しています。

文字とエスケープ

ほとんどの文字はその文字自身に一致します。次の 12 文字は特別な意味を持つため、文字どおりに一致させるにはバックスラッシュが必要です:\ ^ $ . | ? * + ( ) [ {(位置によっては ] } も)。

.任意の 1 文字#

改行以外の任意の 1 文字。改行も含めるには s(dotAll)フラグを付けます。

/h.t/g 対象 “hat hot h t hit h↵t” 一致 “hat” “hot” “h t” “hit”
✓ JS 対応✓ PCRE 対応✓ Py 対応✓ Go 対応✓ Java 対応✓ .NET 対応
  • Python re: 除外されるのは \n だけ。JavaScript では \r、\u2028、\u2029 も除外されます。
  • Go RE2: 除外されるのは \n だけ。
\. \$ \(メタ文字のエスケープ#

バックスラッシュを付けると、次の特殊文字が文字どおりの意味になります。\. は本物のドット、\$ はドル記号です。

/\$\d+\.\d{2}/g 対象 “Total $45.00, tax $3.15, tip 5” 一致 “$45.00” “$3.15”
✓ JS 対応✓ PCRE 対応✓ Py 対応✓ Go 対応✓ Java 対応✓ .NET 対応
\t \n \rタブ、改行、復帰#

制御文字を名前で表します。Windows の改行コードは \r\n なので、\r?\n で両方の形式に一致します。

/\w+\t\w+/g 対象 “name⇥age↵ana⇥31” 一致 “name⇥age” “ana⇥31”
✓ JS 対応✓ PCRE 対応✓ Py 対応✓ Go 対応✓ Java 対応✓ .NET 対応
\xhh16 進コードで指定する文字#

16 進数ちょうど 2 桁。\x41 は A、\x20 はスペースです。

/\x41/g 対象 “A b A” 一致 “A” “A”
✓ JS 対応✓ PCRE 対応✓ Py 対応✓ Go 対応✓ Java 対応✓ .NET 対応
\uhhhhUnicode コード単位で指定する文字#

基本多言語面(BMP)の文字を 16 進数 4 桁で指定します。\u00e9 は é です。

/\u00e9/g 対象 “café résumé” 一致 “é” “é” “é”
✓ JS 対応✗ PCRE 非対応✓ Py 対応✗ Go 非対応✓ Java 対応✓ .NET 対応
  • PCRE / PHP: \x{e9} を使います。
  • Go RE2: \x{e9} を使います。
\u{1F600}任意のコードポイント(BMP 外も可)#

コードポイントを波括弧で囲みます。絵文字など U+FFFF を超える文字に必要です。JavaScript では u または v フラグが必要です。

/\u{1F600}/gu 対象 “Hi 😀 there 😀” 一致 “😀” “😀”
✓ JS 対応~ PCRE 記法が異なる/制限あり~ Py 記法が異なる/制限あり~ Go 記法が異なる/制限あり~ Java 記法が異なる/制限あり✗ .NET 非対応
  • PCRE / PHP: \x{1F600} と書きます(PHP では u 修飾子が必要)。
  • Python re: \U0001F600 と書きます(16 進数 8 桁)。
  • Go RE2: \x{1F600} と書きます。
  • Java: \x{1F600} と書きます。
  • .NET: \uhhhh のみ。絵文字は UTF-16 の 2 コード単位になります(例:\uD83D\uDE00)。

文字クラス

文字クラスは、集合の中のちょうど 1 文字に一致します。[ ] の中ではほとんどのメタ文字が意味を失い、注意が必要なのは ] \ ^ - だけです。

[abc]いずれか 1 文字#

リスト内の 1 文字。

/gr[ae]y/g 対象 “gray grey groy” 一致 “gray” “grey”
✓ JS 対応✓ PCRE 対応✓ Py 対応✓ Go 対応✓ Java 対応✓ .NET 対応
[^abc]いずれでもない 1 文字#

リストにない 1 文字(^ は先頭以外では文字どおり)。改行にも一致します。

/[^aeiou\s]/g 対象 “regex” 一致 “r” “g” “x”
✓ JS 対応✓ PCRE 対応✓ Py 対応✓ Go 対応✓ Java 対応✓ .NET 対応
[a-z]範囲#

2 つのコードポイントの間の文字。範囲は組み合わせられ、[A-Fa-f0-9] は 16 進数の 1 桁です。先頭または末尾の - は文字どおりです。

/[A-Fa-f0-9]+/g 対象 “x: 3fA9 zz” 一致 “3fA9”
✓ JS 対応✓ PCRE 対応✓ Py 対応✓ Go 対応✓ Java 対応✓ .NET 対応
\d \D数字/数字以外#

\d は数字、\D はそれ以外。

/\d+/g 対象 “Order 66, room 101” 一致 “66” “101”
✓ JS 対応✓ PCRE 対応✓ Py 対応✓ Go 対応✓ Java 対応✓ .NET 対応
  • Python re: str パターンでは \d が Unicode の任意の数字(例:٣)に一致します。0-9 だけにするには re.ASCII を使います。
  • .NET: RegexOptions.ECMAScript を指定しない限り、Unicode の任意の数字に一致します。
\w \W単語構成文字/それ以外#

英字、数字、アンダースコア。JavaScript と Go では ASCII のみなので、\w は é に一致しません。

/\w+/g 対象 “snake_case and kebab-case” 一致 “snake_case” “and” “kebab” “case”
✓ JS 対応✓ PCRE 対応✓ Py 対応✓ Go 対応✓ Java 対応✓ .NET 対応
  • PCRE / PHP: PCRE2_UCP でなければ ASCII のみ(PHP では u 修飾子と (*UCP))。
  • Python re: str パターンでは初期設定で Unicode の文字と数字。
  • Java: U フラグ(UNICODE_CHARACTER_CLASS)がオンでなければ ASCII のみ。
  • .NET: Unicode の文字、数字、連結用句読点。
\s \S空白/空白以外#

スペース、タブ、改行、および(ほとんどのエンジンでは)その他の Unicode の空白。

/\s+/g 対象 “a b⇥c” 一致 “ ” “⇥”
✓ JS 対応✓ PCRE 対応✓ Py 対応✓ Go 対応✓ Java 対応✓ .NET 対応
  • Go RE2: ASCII の空白のみ:\t \n \f \r とスペース。
[[:alpha:]]POSIX ブラケット表現#

[:alpha:]、[:digit:]、[:space:]、[:punct:] などの名前付きクラス。角括弧の中で使います。

記法(JavaScript 以外):[[:alpha:]]+
✗ JS 非対応✓ PCRE 対応✗ Py 非対応✓ Go 対応~ Java 記法が異なる/制限あり✗ .NET 非対応
  • JavaScript: [A-Za-z] か、u フラグ付きで \p{L} を使います。
  • Java: \p{Alpha}、\p{Digit}、\p{Punct} を使います。
[\p{L}--[a-z]]クラスの差集合/積集合#

クラス内での集合演算。JavaScript では v フラグ(ES2024)が必要で、-- が差、&& が積です。

/[\p{L}--[a-z]]+/gv 対象 “abcÉtéXYZ” 一致 “É” “éXYZ”
✓ JS 対応~ PCRE 記法が異なる/制限あり✗ Py 非対応✗ Go 非対応~ Java 記法が異なる/制限あり~ .NET 記法が異なる/制限あり
  • PCRE / PHP: PCRE2 10.45 以降のみ。(?[ … ]) の拡張クラス構文を使います。
  • Java: 積集合は [a-z&&[^aeiou]]。差集合は否定との積集合として書きます。
  • .NET: 差集合は [a-z-[aeiou]]。積集合はなし。

アンカーと境界

アンカーは文字ではなく位置に一致するため、テキストを消費しません。

^ $文字列の先頭/末尾(m 付きなら行)#

m フラグなしでは ^ と $ は入力全体の先頭と末尾、m フラグありでは各行の先頭と末尾です。

/^\w+/gm 対象 “first line↵second line” 一致 “first” “second”
✓ JS 対応✓ PCRE 対応✓ Py 対応✓ Go 対応✓ Java 対応✓ .NET 対応
  • PCRE / PHP: $ は末尾の \n の直前にも一致します。
  • Python re: $ は末尾の \n の直前にも一致します。
  • Java: $ は末尾の行終端文字の直前にも一致します。
  • .NET: $ は末尾の \n の直前にも一致します。
\b単語境界#

単語構成文字とそれ以外の文字(または入力の端)の間。単語全体に一致させるときに使います。

/\bcat\b/g 対象 “cat concat cats cat.” 一致 “cat” “cat”
✓ JS 対応✓ PCRE 対応✓ Py 対応✓ Go 対応✓ Java 対応✓ .NET 対応
  • JavaScript: u フラグを付けても ASCII の単語構成文字のみ。
  • Go RE2: ASCII の単語構成文字のみ。
\B単語境界以外#

単語の内部。例えば「cat」がより長い単語の一部である場合にだけ一致します。

/\Bcat/g 対象 “concat cat bobcat” 一致 “cat” “cat”
✓ JS 対応✓ PCRE 対応✓ Py 対応✓ Go 対応✓ Java 対応✓ .NET 対応
\A \z \Z絶対的な先頭/末尾#

複数行モードに関係なく、入力の先頭と末尾。\Z は末尾の改行も許容します(Python は例外で、\z と同じ意味)。

記法(JavaScript 以外):\A\d+\z
✗ JS 非対応✓ PCRE 対応~ Py 記法が異なる/制限あり~ Go 記法が異なる/制限あり✓ Java 対応✓ .NET 対応
  • JavaScript: m フラグなしで ^ と $ を使います。
  • Python re: \A と \z(3.14 以降)。\Z は他の言語の \z と同じく絶対的な末尾を表します。
  • Go RE2: \A と \z。\Z はなし。
\G直前の一致の終わり#

直前の一致が終わった位置。連続した並びに一致させるときに使います。

記法(JavaScript 以外):\G\d
~ JS 記法が異なる/制限あり✓ PCRE 対応✗ Py 非対応✗ Go 非対応✓ Java 対応✓ .NET 対応
  • JavaScript: \G はなし。y(sticky)フラグで「ちょうどここから始める」同じ動作になります。

量指定子:最長一致、最短一致、強欲

量指定子は直前の要素を繰り返します。最長一致(デフォルト)はできるだけ多く取ってから戻り、最短一致(? を付ける)はできるだけ少なく取り、強欲(+ を付ける)は決して戻りません。

*0 回以上#

0 回から無制限に繰り返します。

/ba*/g 対象 “b ba baaa” 一致 “b” “ba” “baaa”
✓ JS 対応✓ PCRE 対応✓ Py 対応✓ Go 対応✓ Java 対応✓ .NET 対応
+1 回以上#

1 回から無制限に繰り返します。

/lo+l/g 対象 “lol loool ll” 一致 “lol” “loool”
✓ JS 対応✓ PCRE 対応✓ Py 対応✓ Go 対応✓ Java 対応✓ .NET 対応
?省略可能#

0 回または 1 回。

/colou?r/g 対象 “color colour colouur” 一致 “color” “colour”
✓ JS 対応✓ PCRE 対応✓ Py 対応✓ Go 対応✓ Java 対応✓ .NET 対応
{n}ちょうど n 回#

ちょうど n 回繰り返します。

/\d{3}/g 対象 “12 345 6789” 一致 “345” “678”
✓ JS 対応✓ PCRE 対応✓ Py 対応✓ Go 対応✓ Java 対応✓ .NET 対応
{n,}n 回以上#

少なくとも n 回繰り返します。

/\d{2,}/g 対象 “1 22 333” 一致 “22” “333”
✓ JS 対応✓ PCRE 対応✓ Py 対応✓ Go 対応✓ Java 対応✓ .NET 対応
{n,m}n 回以上 m 回以下#

n 回から m 回、できるだけ多く繰り返します。

/\d{2,3}/g 対象 “1 22 4444” 一致 “22” “444”
✓ JS 対応✓ PCRE 対応✓ Py 対応✓ Go 対応✓ Java 対応✓ .NET 対応
  • Go RE2: 1000 を超える回数はエラーになります。
{,m}m 回以下#

0 回から m 回。受け付けるのは一部のエンジンだけで、それ以外では文字どおりの「{,m}」かエラーになります。{0,m} ならどこでも使えます。

記法(JavaScript 以外):\d{,3}
✗ JS 非対応~ PCRE 記法が異なる/制限あり✓ Py 対応✗ Go 非対応✗ Java 非対応✗ .NET 非対応
  • JavaScript: u なしでは文字どおりのテキスト、u ありでは構文エラー。{0,3} と書きます。
  • PCRE / PHP: PCRE2 10.43 以降のみ。
  • Go RE2: {0,3} と書きます。
  • Java: {0,3} と書きます。
  • .NET: 文字どおりのテキストとして扱われます。{0,3} と書きます。
.* .+最長一致(デフォルト)#

できるだけ長く一致させ、残りが合うまで文字を戻します。この例では両方のタグを飲み込んでしまいます。

/<.+>/g 対象 “<b>bold</b>” 一致 “<b>bold</b>”
✓ JS 対応✓ PCRE 対応✓ Py 対応✓ Go 対応✓ Java 対応✓ .NET 対応
*? +? ?? {n,m}?最短一致(非貪欲)#

できるだけ短く一致させます。パターンが「一致しすぎる」ときはたいていこれで解決します。

/<.+?>/g 対象 “<b>bold</b>” 一致 “<b>” “</b>”
✓ JS 対応✓ PCRE 対応✓ Py 対応✓ Go 対応✓ Java 対応✓ .NET 対応
  • Go RE2: 最長一致と最短一致を入れ替える U フラグとしても使えます。
*+ ++ ?+強欲な量指定子#

バックトラックしない最長一致。一度一致した文字は決して戻しません。失敗が速く、壊滅的なバックトラックの防止策にもなります。

記法(JavaScript 以外):"[^"]*+"
✗ JS 非対応✓ PCRE 対応~ Py 記法が異なる/制限あり✗ Go 非対応✓ Java 対応✗ .NET 非対応
  • JavaScript: 強欲な量指定子もアトミックグループもなし。(?=(…))\1 で代用します。
  • Python re: Python 3.11 以降。
  • Go RE2: 不要:RE2 はバックトラックしません。
  • .NET: アトミックグループ (?>…) を使います。

グループと後方参照

丸括弧は量指定子や選択のために要素をまとめ、(非キャプチャ指定がなければ)一致した内容を保存します。

( … )キャプチャグループ#

まとめてキャプチャします。開き括弧の順に 1 から番号が振られます。

/(\d{3})-(\d{4})/g 対象 “Call 555-0199 or 555-0123” 一致 “555-0199” “555-0123”
✓ JS 対応✓ PCRE 対応✓ Py 対応✓ Go 対応✓ Java 対応✓ .NET 対応
(?: … )非キャプチャグループ#

保存せずにまとめるだけなので、グループ番号が変わらず、処理も少し軽くなります。

/(?:ab)+/g 対象 “ababab ab a” 一致 “ababab” “ab”
✓ JS 対応✓ PCRE 対応✓ Py 対応✓ Go 対応✓ Java 対応✓ .NET 対応
(?<name> … )名前付きグループ#

名前を付けてキャプチャし、後から読み出せます(JavaScript では match.groups.name)。

/(?<year>\d{4})-(?<month>\d{2})/g 対象 “Released 2026-10” 一致 “2026-10”
✓ JS 対応✓ PCRE 対応~ Py 記法が異なる/制限あり✓ Go 対応✓ Java 対応✓ .NET 対応
  • PCRE / PHP: (?'name'…) と (?P<name>…) も可。
  • Python re: (?P<name>…) のみ。
  • Go RE2: (?P<name>…)。Go 1.22 以降は (?<name>…) も可。
  • .NET: (?'name'…) も可。
\1番号による後方参照#

前にグループがキャプチャしたのと同じテキストに一致します。

/(\w)\1/g 対象 “bookkeeper” 一致 “oo” “kk” “ee”
✓ JS 対応✓ PCRE 対応✓ Py 対応✗ Go 非対応✓ Java 対応✓ .NET 対応
  • Go RE2: RE2 には後方参照がありません(線形時間の保証が崩れるため)。
\k<name>名前による後方参照#

\1 と同じですが名前で指定します。この例は対になった引用符で囲まれたテキストに一致します。

/(?<q>['"]).*?\k<q>/g 対象 “say "hi" or 'yo'” 一致 “"hi"” “'yo'”
✓ JS 対応✓ PCRE 対応~ Py 記法が異なる/制限あり✗ Go 非対応✓ Java 対応✓ .NET 対応
  • PCRE / PHP: \k{name}、\g{name}、(?P=name) も可。
  • Python re: (?P=name) と書きます。
a|b選択(OR)#

どちらか一方。選択肢は左から順に試されるため、一方が他方の接頭辞になる場合は長いほうを先に置きます。

/cat|dog/g 対象 “hotdog catalog” 一致 “dog” “cat”
✓ JS 対応✓ PCRE 対応✓ Py 対応✓ Go 対応✓ Java 対応✓ .NET 対応
(?> … )アトミックグループ#

グループが一度一致すると、エンジンはその中へバックトラックしません。

記法(JavaScript 以外):(?>a|ab)c
✗ JS 非対応✓ PCRE 対応~ Py 記法が異なる/制限あり✗ Go 非対応✓ Java 対応✓ .NET 対応
  • Python re: Python 3.11 以降。
  • Go RE2: 不要:RE2 はバックトラックしません。
(?i) (?i: … )インラインフラグ#

パターン内でフラグをオン/オフします。(?i) はパターンの残り全体に、(?i:…) はそのグループだけに適用され、(?-i:…) はフラグをオフにします。

/(?i:hello) world/g 対象 “HELLO world HELLO WORLD” 一致 “HELLO world”
~ JS 記法が異なる/制限あり✓ PCRE 対応✓ Py 対応✓ Go 対応✓ Java 対応✓ .NET 対応
  • JavaScript: 範囲を限定した (?i:…)/(?-i:…) 形式のみで、i、m、s に対応(ES2025)。先頭の (?i) は構文エラーです。
  • Python re: グローバルな (?i) はパターンの一番先頭に置く必要があります(3.11 以降、それ以外の位置ではエラー)。(?i:…) はどこでも使えます。
(?(1)yes|no)条件分岐#

グループ 1 が一致に参加していれば「yes」、そうでなければ「no」に一致します。

記法(JavaScript 以外):(<)?\w+(?(1)>)
✗ JS 非対応✓ PCRE 対応✓ Py 対応✗ Go 非対応✗ Java 非対応✓ .NET 対応
(?R) (?1)再帰/サブルーチン#

パターン全体やグループに再び入ります。対応の取れた括弧のような入れ子構造に使います。

記法(JavaScript 以外):\((?:[^()]|(?R))*\)
✗ JS 非対応✓ PCRE 対応✗ Py 非対応✗ Go 非対応✗ Java 非対応~ .NET 記法が異なる/制限あり
  • Python re: サードパーティの regex モジュールで使えます。
  • .NET: 再帰はなし。バランスグループ (?<open-close>…) で入れ子を扱います。
(?# … )インラインコメント#

エンジンに無視されます。長いコメントには x(拡張)フラグを使います。

記法(JavaScript 以外):\d{3}(?#area code)
✗ JS 非対応✓ PCRE 対応✓ Py 対応✗ Go 非対応✗ Java 非対応✓ .NET 対応

先読みと後読み

先読み・後読みは、現在位置の隣に何があるかを、一致には含めずに確認します。アンカーと同じく幅ゼロです。

(?= … )肯定先読み#

後ろに … が続く(一致には含まれない)。

/\d+(?=px)/g 対象 “10px 20em 30px” 一致 “10” “30”
✓ JS 対応✓ PCRE 対応✓ Py 対応✗ Go 非対応✓ Java 対応✓ .NET 対応
  • Go RE2: RE2 には先読み・後読みが一切ありません。
(?! … )否定先読み#

後ろに … が続かない。中の \d により、チェックを通すためにエンジンが数字を戻すのを防いでいます。

/\d+(?!px|\d)/g 対象 “10px 20em” 一致 “20”
✓ JS 対応✓ PCRE 対応✓ Py 対応✗ Go 非対応✓ Java 対応✓ .NET 対応
(?<= … )肯定後読み#

前に … がある(一致には含まれない)。

/(?<=\$)\d+(?:\.\d\d)?/g 対象 “Cost: $42.50 or 42” 一致 “42.50”
✓ JS 対応~ PCRE 記法が異なる/制限あり~ Py 記法が異なる/制限あり✗ Go 非対応~ Java 記法が異なる/制限あり✓ .NET 対応
  • JavaScript: 任意の長さ(ES2018)。
  • PCRE / PHP: 各選択肢の長さに上限が必要。PCRE2 10.43 以降は可変長(初期設定で最大 255)に対応。
  • Python re: 固定長のみ:(?<=ab|cd) は可、(?<=a+) はエラー。
  • Java: 長さに上限があるもののみ:中に * や + は使えません。
  • .NET: 任意の長さ。
(?<! … )否定後読み#

前に … がない。

/(?<!\$)\b\d+\b/g 対象 “$30 and 45” 一致 “45”
✓ JS 対応~ PCRE 記法が異なる/制限あり~ Py 記法が異なる/制限あり✗ Go 非対応~ Java 記法が異なる/制限あり✓ .NET 対応
  • PCRE / PHP: 長さの規則は肯定後読みと同じ。
  • Python re: 固定長のみ。
  • Java: 長さに上限があるもののみ。
\K一致開始位置のリセット#

それまでに一致した部分をすべて結果から外します。長さ制限のない後読みとして使えます。

記法(JavaScript 以外):price: \K\d+
✗ JS 非対応✓ PCRE 対応✗ Py 非対応✗ Go 非対応✗ Java 非対応✗ .NET 非対応
  • JavaScript: (?<=…) かキャプチャグループを使います。

フラグ(修飾子)

JavaScript ではフラグを閉じスラッシュの後に書きます(/x/gi)。他の言語では定数(re.I、Pattern.CASE_INSENSITIVE、RegexOptions.IgnoreCase)を渡すか、インラインの (?i) を使います。

gグローバル(すべての一致)#

最初の一致で止まらず、すべての一致を探します。matchAll と replaceAll では必須です。

/o/g 対象 “foo boo” 一致 “o” “o” “o” “o”
✓ JS 対応~ PCRE 記法が異なる/制限あり~ Py 記法が異なる/制限あり~ Go 記法が異なる/制限あり~ Java 記法が異なる/制限あり~ .NET 記法が異なる/制限あり
  • PCRE / PHP: フラグなし:preg_match_all()/preg_replace() を使います。
  • Python re: フラグなし:re.findall()、re.finditer()、re.sub() を使います。
  • Go RE2: フラグなし:FindAll… メソッドを使います。
  • Java: フラグなし:matcher.find() でループします。
  • .NET: フラグなし:Regex.Matches() を使います。
i大文字・小文字を区別しない#

大文字と小文字を区別せずに一致させます。

/hello/gi 対象 “Hello HELLO hello” 一致 “Hello” “HELLO” “hello”
✓ JS 対応✓ PCRE 対応✓ Py 対応✓ Go 対応✓ Java 対応✓ .NET 対応
  • Python re: re.I/re.IGNORECASE または (?i)。
  • Java: CASE_INSENSITIVE(UNICODE_CASE なしでは ASCII のみ)または (?i)。
  • .NET: RegexOptions.IgnoreCase または (?i)。
m複数行#

^ と $ が入力の両端だけでなく、各行の先頭と末尾にも一致します。

/^-\s.+$/gm 対象 “- one↵- two↵three” 一致 “- one” “- two”
✓ JS 対応✓ PCRE 対応✓ Py 対応✓ Go 対応✓ Java 対応✓ .NET 対応
  • Python re: re.M/re.MULTILINE。
  • .NET: RegexOptions.Multiline。
sドットが改行にも一致#

. が改行にも一致するようになります。このフラグがない場合、どこでも使える「任意の文字」は [\s\S] です。

/<p>.*?</p>/gs 対象 “<p>a↵b</p>” 一致 “<p>a↵b</p>”
✓ JS 対応✓ PCRE 対応✓ Py 対応✓ Go 対応✓ Java 対応✓ .NET 対応
  • Python re: re.S/re.DOTALL。
  • Java: Pattern.DOTALL。
  • .NET: RegexOptions.Singleline という名前です。
x拡張(フリースペーシング)#

パターン内の空白が無視され、# 以降がコメントになるため、長いパターンを複数行に分けて書けます。

記法(JavaScript 以外):(?x) \d{3} - \d{4} # local number
✗ JS 非対応✓ PCRE 対応✓ Py 対応✗ Go 非対応✓ Java 対応✓ .NET 対応
  • Python re: re.X/re.VERBOSE。
  • Java: Pattern.COMMENTS。
  • .NET: RegexOptions.IgnorePatternWhitespace。
uUnicode#

入力をコードポイント単位で扱い(. が絵文字全体に一致する)、\p{…} と \u{…} を有効にし、無効なエスケープをエラーにします。

/^.$/gu 対象 “😀” 一致 “😀”
✓ JS 対応~ PCRE 記法が異なる/制限あり~ Py 記法が異なる/制限あり~ Go 記法が異なる/制限あり~ Java 記法が異なる/制限あり~ .NET 記法が異なる/制限あり
  • PCRE / PHP: PHP の u 修飾子(UTF-8 モード)。Unicode の \w や \d には (*UCP) を追加します。
  • Python re: フラグ不要:str パターンは Unicode。re.ASCII で無効にできます。
  • Go RE2: フラグなし:Go は常に UTF-8 のコードポイント単位で動作します。
  • Java: UNICODE_CASE と UNICODE_CHARACTER_CLASS(U)。
  • .NET: フラグなし:常に UTF-16 のコード単位(絵文字は 2 単位)。
vUnicode セット#

u を強化した ES2024 のフラグ。クラスの集合演算(--、&&)、入れ子のクラス、\p{RGI_Emoji} のような文字列プロパティに対応します。u とは併用できません。

/[\p{L}&&\p{ASCII}]+/gv 対象 “Ünïcode text” 一致 “n” “code” “text”
✓ JS 対応✗ PCRE 非対応✗ Py 非対応✗ Go 非対応✗ Java 非対応✗ .NET 非対応
yスティッキー#

各一致は直前の一致が終わった位置(lastIndex)から始まる必要があります。トークナイザーに便利です。

/\d/gy 対象 “12a3” 一致 “1” “2”
✓ JS 対応~ PCRE 記法が異なる/制限あり~ Py 記法が異なる/制限あり✗ Go 非対応~ Java 記法が異なる/制限あり~ .NET 記法が異なる/制限あり
  • PCRE / PHP: \G を使います。
  • Python re: pattern.match(text, pos) を使います。
  • Java: \G または matcher.lookingAt() を使います。
  • .NET: \G を使います。
d一致位置のインデックス#

各キャプチャグループの開始・終了位置を含む match.indices を追加します(ES2022)。

記法(JavaScript 以外):/(?<y>\d{4})/d
✓ JS 対応~ PCRE 記法が異なる/制限あり~ Py 記法が異なる/制限あり~ Go 記法が異なる/制限あり~ Java 記法が異なる/制限あり~ .NET 記法が異なる/制限あり
  • PCRE / PHP: オフセットは常に取得可能(PREG_OFFSET_CAPTURE)。
  • Python re: 常に取得可能:m.span(n)。
  • Go RE2: 常に取得可能:FindStringSubmatchIndex。
  • Java: 常に取得可能:matcher.start(n)/end(n)。
  • .NET: 常に取得可能:Group.Index/Length。

Unicode プロパティ \p{…}

プロパティエスケープは Unicode のカテゴリや用字で文字に一致させます。言語を問わず「任意の文字」に一致させる確実な方法はこれだけです。JavaScript では u または v フラグが必要です。

\p{L}任意の文字(レター)#

あらゆる用字の文字:é、ß、東、д。

/\p{L}+/gu 対象 “naïve café 東京 123” 一致 “naïve” “café” “東京”
✓ JS 対応✓ PCRE 対応✗ Py 非対応✓ Go 対応✓ Java 対応✓ .NET 対応
  • PCRE / PHP: PHP で UTF-8 の入力を扱うには u 修飾子が必要です。
  • Python re: サードパーティの regex モジュールを使うか、「文字」として [^\W\d_] を使います。
\p{Lu} \p{Ll}大文字/小文字#

一般カテゴリ:Lu 大文字、Ll 小文字、N 数字、P 句読点、S 記号、Z 区切り。

/\p{Lu}/gu 対象 “Élan Vital” 一致 “É” “V”
✓ JS 対応✓ PCRE 対応✗ Py 非対応✓ Go 対応✓ Java 対応✓ .NET 対応
\P{…}プロパティに含まれない#

大文字の P で否定になります。\P{L} は文字(レター)以外すべてです。

/\P{L}+/gu 対象 “abc-123” 一致 “-123”
✓ JS 対応✓ PCRE 対応✗ Py 非対応✓ Go 対応✓ Java 対応✓ .NET 対応
\pL1 文字の短縮形#

1 文字のカテゴリは波括弧なしで書けます。

記法(JavaScript 以外):\pL+
✗ JS 非対応✓ PCRE 対応✗ Py 非対応✓ Go 対応✓ Java 対応✗ .NET 非対応
  • JavaScript: 波括弧が必須:\p{L}。
  • .NET: 波括弧が必須:\p{L}。
\p{Script=Greek}用字(スクリプト)#

1 つの文字体系に属する文字。sc= は短縮形です。Script_Extensions(scx=)は複数の用字で共有される文字も含みます。

/\p{Script=Greek}+/gu 対象 “alpha α, beta β” 一致 “α” “β”
✓ JS 対応~ PCRE 記法が異なる/制限あり✗ Py 非対応~ Go 記法が異なる/制限あり✓ Java 対応✗ .NET 非対応
  • PCRE / PHP: \p{Greek}、\p{sc:Greek} または \p{scx:Greek}。
  • Go RE2: \p{Greek}。
  • Java: \p{script=Greek}、\p{sc=Greek} または \p{IsGreek} と書きます。
  • .NET: \p{IsGreek} のような名前付きブロックのみ(用字ではなくコード範囲)。
\p{sc=Han}漢字(中国語・日本語)#

漢字(CJK 統合漢字)。日本語のかなには \p{sc=Hiragana} と \p{sc=Katakana} を追加します。

/\p{sc=Han}+/gu 対象 “Tokyo 東京 2026 中文” 一致 “東京” “中文”
✓ JS 対応~ PCRE 記法が異なる/制限あり✗ Py 非対応~ Go 記法が異なる/制限あり✓ Java 対応~ .NET 記法が異なる/制限あり
  • PCRE / PHP: \p{Han}。
  • Python re: [\u4e00-\u9fff] のような範囲を使います(主要ブロックのみが対象)。
  • Go RE2: \p{Han}。
  • Java: \p{IsHan} も可。
  • .NET: ブロックのみ。例:\p{IsCJKUnifiedIdeographs}。
\p{RGI_Emoji}絵文字(シーケンス全体)#

v フラグを使うと、肌の色や家族のシーケンスを含む絵文字全体に一致します。u では \p{Extended_Pictographic} が単独の絵文字にのみ一致します。

/\p{RGI_Emoji}/gv 対象 “Go 👍🏽 team 👨‍👩‍👧!” 一致 “👍🏽” “👨‍👩‍👧”
✓ JS 対応~ PCRE 記法が異なる/制限あり✗ Py 非対応✗ Go 非対応~ Java 記法が異なる/制限あり✗ .NET 非対応
  • PCRE / PHP: 最近の PCRE2(10.40 以降)では Boolean プロパティで単独のコードポイントに一致。シーケンス用のプロパティはなし。
  • Java: \p{IsEmoji} は単独のコードポイントに一致(Java 21 以降)。
\X書記素クラスター#

ユーザーが 1 文字と認識する単位。例:e と結合アクセント記号、国旗の絵文字。

記法(JavaScript 以外):\X
✗ JS 非対応✓ PCRE 対応✗ Py 非対応✗ Go 非対応✓ Java 対応✗ .NET 非対応
  • JavaScript: 書記素への分割には Intl.Segmenter を使います。
  • Python re: regex モジュールで使えます。

置換文字列の記法

置換文字列に書く内容です。言語による違いが最も大きい部分なので、JavaScript の例よりも、使っている言語の列のほうが重要です。

$&一致全体#

一致したテキスト全体を挿入します。

/\d+/g 対象 “3 apples, 12 pears” 置換後 “[$&]” → “[3] apples, [12] pears”
✓ JS 対応~ PCRE 記法が異なる/制限あり~ Py 記法が異なる/制限あり~ Go 記法が異なる/制限あり~ Java 記法が異なる/制限あり✓ .NET 対応
  • PCRE / PHP: preg_replace では $0 または \0。
  • Python re: \g<0>。
  • Go RE2: ${0} または $0(Expand/ReplaceAllString)。
  • Java: $0.
  • .NET: $0 も可。
$1番号付きグループ#

グループ 1 がキャプチャした内容を挿入します。2 つの単語を入れ替える例:

/(\w+)\s(\w+)/g 対象 “hello world” 置換後 “$2 $1” → “world hello”
✓ JS 対応✓ PCRE 対応~ Py 記法が異なる/制限あり✓ Go 対応✓ Java 対応✓ .NET 対応
  • PCRE / PHP: \1 と ${1} も可。
  • Python re: \1 または \g<1>(raw 文字列 r"\1" を使う)。
  • Go RE2: 直後に英字や数字が続く場合は ${1}x と書きます。そうしないと Go は $1x を「1x」という名前のグループとして読みます。
$<name>名前付きグループ#

名前付きグループの内容を挿入します。ISO 形式の日付を日/月/年に並べ替える例:

/(?<y>\d{4})-(?<m>\d{2})-(?<d>\d{2})/g 対象 “2026-10-18” 置換後 “$<d>/$<m>/$<y>” → “18/10/2026”
✓ JS 対応✗ PCRE 非対応~ Py 記法が異なる/制限あり~ Go 記法が異なる/制限あり~ Java 記法が異なる/制限あり~ .NET 記法が異なる/制限あり
  • PCRE / PHP: preg_replace には名前による参照がありません。グループ番号か preg_replace_callback() を使います。
  • Python re: \g<name>。
  • Go RE2: ${name}(または $name)。
  • Java: ${name}。
  • .NET: ${name}。
$$ドル記号そのもの#

置換文字列内の $ をエスケープします。

/(\d+)/g 対象 “Price: 20” 置換後 “$$$1” → “Price: $20”
✓ JS 対応~ PCRE 記法が異なる/制限あり~ Py 記法が異なる/制限あり✓ Go 対応~ Java 記法が異なる/制限あり✓ .NET 対応
  • PCRE / PHP: 後ろに数字や { が続かない $ はそのまま文字として扱われます。その後に続ける場合は ${1} と書きます。
  • Python re: $ は特殊文字ではありません。バックスラッシュは \\ とエスケープします。
  • Java: \$(Matcher.quoteReplacement() で文字列全体をエスケープできます)。
$` $'一致の前/後のテキスト#

一致の前または後の入力を挿入します。めったに使いませんが、ときどき便利です。

/=/ 対象 “key=value” 置換後 “ is set ($') and was ($`) ” → “key is set (value) and was (key) value”
✓ JS 対応✗ PCRE 非対応✗ Py 非対応✗ Go 非対応✗ Java 非対応✓ .NET 対応

よく使うレシピ(注意点つき)

特によく検索されるパターンを、読みやすく壊滅的なバックトラックが起きないように書いています。それぞれ、できないことも明記しています。

Email (practical)メールアドレスらしき文字列を探す#

ローカル部、@、ドットを 1 つ以上含むドメイン。

/[\w.+-]+@[\w-]+(?:\.[\w-]+)+/g 対象 “Write to ana.lee+news@example.co.uk or bob@test.dev.” 一致 “ana.lee+news@example.co.uk” “bob@test.dev”

注意: 有効でもまれなアドレス(引用符付きのローカル部、ASCII 以外のドメイン)は弾き、一部の無効なアドレス(a..b@x.y)は通してしまいます。メールボックスが実在するかは正規表現ではわかりません。確認メールを送りましょう。

✓ JS 対応✓ PCRE 対応✓ Py 対応✓ Go 対応✓ Java 対応✓ .NET 対応
URLテキスト中の http(s) リンクを探す#

空白、引用符、山括弧で止まり、末尾のピリオドやカンマなどの句読点は除外します。

/https?://[^\s<>"]*[^\s<>".,;:!?)]/g 対象 “See https://example.com/a?b=1, or (http://test.dev/x).” 一致 “https://example.com/a?b=1” “http://test.dev/x”

注意: テキストのリンク化には向いていますが、検証用ではありません。URL を確認するには言語の URL パーサー(JavaScript なら new URL())を使い、プロトコルとホストを確認してください。

✓ JS 対応✓ PCRE 対応✓ Py 対応✓ Go 対応✓ Java 対応✓ .NET 対応
IPv4 address0〜255 の 4 つのオクテット#

各オクテットを先頭ゼロなしの 0〜255 に制限します。

/\b(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}\b/g 対象 “10.0.0.1 256.1.1.1 192.168.1.254” 一致 “10.0.0.1” “192.168.1.254”

注意: IPv6、CIDR 表記、ポート番号には対応しません。検証には IP パーサー(Python の ipaddress、Go の net/netip、Node の net.isIP)を使いましょう。

✓ JS 対応✓ PCRE 対応✓ Py 対応✓ Go 対応✓ Java 対応✓ .NET 対応
Date YYYY-MM-DDISO 8601 形式の日付#

月は 01〜12、日は 01〜31。

/\b\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01])\b/g 対象 “2026-10-18, 2026-13-01, 2026-02-31” 一致 “2026-10-18” “2026-02-31”

注意: 形式のみの確認なので、2026-02-31 も通ります。存在しない日付を弾くには日付ライブラリでパースしてください。

✓ JS 対応✓ PCRE 対応✓ Py 対応✓ Go 対応✓ Java 対応✓ .NET 対応
Date MM/DD/YYYY米国式の日付#

1〜2 桁の月と日、4 桁の年。

/\b(?:0?[1-9]|1[0-2])/(?:0?[1-9]|[12]\d|3[01])/\d{4}\b/g 対象 “Due 10/18/2026 or 1/5/2027, not 13/01/2026” 一致 “10/18/2026” “1/5/2027”

注意: 01/02/2026 は米国では 1 月 2 日ですが、ほとんどの国では 2 月 1 日です。どちらの意味かは正規表現にはわかりません。

✓ JS 対応✓ PCRE 対応✓ Py 対応✓ Go 対応✓ Java 対応✓ .NET 対応
Phone (North America)(416) 555-0199 とその表記ゆれ#

10 桁の数字。丸括弧、スペース、ドット、ハイフンは任意。

/\(?\b\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}\b/g 対象 “(416) 555-0199, 416.555.0199, 4165550199” 一致 “(416) 555-0199” “416.555.0199” “4165550199”

注意: 北米の電話番号のみ。国際番号には libphonenumber などのライブラリを使い、E.164 形式で保存しましょう(次の行)。

✓ JS 対応✓ PCRE 対応✓ Py 対応✓ Go 対応✓ Java 対応✓ .NET 対応
Phone (E.164)国際形式 +CC…#

プラス記号、0 で始まらない国番号、合計 15 桁まで。

/^\+[1-9]\d{1,14}$/gm 対象 “+14165550199↵+447911123456↵0044791112” 一致 “+14165550199” “+447911123456”

注意: E.164 の形式を確認するだけで、番号が割り当て済みか、その国として正しい桁数かは確認しません。

✓ JS 対応✓ PCRE 対応✓ Py 対応✓ Go 対応✓ Java 対応✓ .NET 対応
Hex colour#rgb、#rgba、#rrggbb、#rrggbbaa#

CSS で使える 4 種類の長さ。

/#(?:[\da-fA-F]{8}|[\da-fA-F]{6}|[\da-fA-F]{3,4})\b/g 対象 “#fff #244b3f #12345 #ff000080 #1234567” 一致 “#fff” “#244b3f” “#ff000080”

注意: #フラグメント付きの URL など、長いテキストの一部にも一致します。単一の値を検証するには ^…$ で固定してください。

✓ JS 対応✓ PCRE 対応✓ Py 対応✓ Go 対応✓ Java 対応✓ .NET 対応
URL sluglowercase-words-with-hyphens#

小文字の英字と数字を、1 つずつのハイフンで区切ったもの。

/^[a-z0-9]+(?:-[a-z0-9]+)*$/gm 対象 “my-post-2026↵My Post↵-bad-↵good” 一致 “my-post-2026” “good”

注意: ASCII のみ。タイトルからスラッグを作るなら、正規表現ではなく URL スラッグ生成ツールを使いましょう。

✓ JS 対応✓ PCRE 対応✓ Py 対応✓ Go 対応✓ Java 対応✓ .NET 対応
Trim whitespace前後の空白#

空文字列で置換します。m フラグなしでは、^ と $ はテキスト全体の両端です。

/^\s+|\s+$/g 対象 “ padded text ” 置換後 “” → “padded text”

注意: 最近の言語にはどれも組み込みの trim() があり、そのほうが速くてわかりやすいです。正規表現はコードを呼び出せない場面(エディター、設定ファイル)でだけ使いましょう。

✓ JS 対応✓ PCRE 対応✓ Py 対応✓ Go 対応✓ Java 対応✓ .NET 対応
Collapse spaces連続する空白を 1 つに#

2 つ以上連続するスペースやタブを 1 つのスペースに置換します。

/[ \t]{2,}/g 対象 “too many ⇥ spaces” 置換後 “ ” → “too many spaces”
✓ JS 対応✓ PCRE 対応✓ Py 対応✓ Go 対応✓ Java 対応✓ .NET 対応
Duplicate wordsthe the、is is(重複した単語)#

同じ単語が続く箇所。i を付ければ「The the」も検出します。

/\b(\w+)\s+\1\b/gi 対象 “This is is a test test of The the editor” 一致 “is is” “test test” “The the”

注意: 後方参照が必要なため Go では動きません。「had had」や「that that」は英語として正しい場合もあります。

✓ JS 対応✓ PCRE 対応✓ Py 対応✓ Go 対応✓ Java 対応✓ .NET 対応
Password rules小文字・大文字・数字を含む 12 文字以上#

各先読みが先頭から 1 つずつ条件を確認し、.{12,} で長さを指定します。

/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{12,}$/gm 対象 “short1A↵alllowercase123↵GoodPassword42” 一致 “GoodPassword42”

注意: NIST SP 800-63B は文字種の組み合わせルールを推奨していません。代わりに長さを必須にし、漏えいしたパスワードのリストと照合しましょう。

✓ JS 対応✓ PCRE 対応✓ Py 対応✓ Go 対応✓ Java 対応✓ .NET 対応
UUID8-4-4-4-12 の 16 進数#

RFC 9562 のバリアントビットを持つバージョン 1〜8。

/\b[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}\b/gi 対象 “id 3f2b8c1e-9d4a-4b7e-8f6a-1c2d3e4f5a6b and 00000000-0000-0000-0000-000000000000” 一致 “3f2b8c1e-9d4a-4b7e-8f6a-1c2d3e4f5a6b”

注意: 有効な特殊値である Nil UUID(すべて 0)と Max UUID(すべて f)は弾かれます。

✓ JS 対応✓ PCRE 対応✓ Py 対応✓ Go 対応✓ Java 対応✓ .NET 対応
Strip HTML tags<タグ> を削除#

空文字列で置換すると、おおまかなプレーンテキストが得られます。

/<[^>]+>/g 対象 “<p>Hello <b>world</b></p>” 置換後 “” → “Hello world”

注意: 属性、コメント、スクリプト内の > で壊れ、&amp; などのエンティティもデコードしません。信頼できない HTML のサニタイズには絶対に使わず、DOMParser や DOMPurify などのサニタイザーを使ってください。

✓ JS 対応✓ PCRE 対応✓ Py 対応✓ Go 対応✓ Java 対応✓ .NET 対応

静的なリファレンスです。検索と絞り込みはブラウザ内で行われ、「試す」リンクはブラウザ上で動く正規表現テスターを開きます。 すべての無料ツールを見る.

不具合や改善できそうな点を見つけましたか?いただいたメッセージはすべて読み、すぐに対応します。

この正規表現チートシートは、\d や \b から後読み、強欲な量指定子、\p{Script=Greek} まで、必要になりそうな正規表現のトークンをすべて掲載し、それぞれ短い説明と、何に一致するかが正確にわかる例を付けています。すべての例に「試す」リンクがあり、パターン、フラグ、サンプルテキストを入力済みの状態で当サイトの正規表現テスターが開くので、書き換えて一致箇所が変わる様子を確かめられます。

正規表現はどこでも同じに見えますが、そうではありません。後読みは JavaScript と .NET では長さ無制限、Python では固定長、Java と PCRE では上限付きで、Go にはありません。Python は名前付きグループを (?P<name>…) と書き、PHP は置換で名前を使えず、\A、\K、(?R) を知っているのは一部のエンジンだけです。方言セレクターは、各トークンの JavaScript、PCRE/PHP、Python、Go、Java、.NET での対応状況を、代わりの書き方があればそれも含めて表示します。例そのものは JavaScript で動作するので、他の言語では注記を読み、リリース前にその言語でテストしてください。

使い方

  1. トークン(\b、先読み)や作業(メール、空白の除去、重複語)で検索するか、上部のチップからセクションに移動します。
  2. 方言バーで使う言語を選びます。対応していないトークンは薄く表示され、各項目の下の注記にはその言語での代わりの書き方が示されます。
  3. 「正規表現テスターで試す」をクリックすると例がその場で動作し、そこでパターンやテキストを編集できます。
  4. 項目の横の # を使うとその項目に直接リンクでき、「印刷 / PDF として保存」でコンパクトな 2 段組みの版を作れます。

よくある質問

貪欲な量指定子と怠惰な量指定子の違いは何ですか?

貪欲な量指定子(*、+、{n,m})はできるだけ多くの文字を取り、パターンの残りが失敗したら一部を返します。怠惰な量指定子(*?、+?、{n,m}?)はできるだけ少なく取ります。<b>bold</b> に対して、<.+> は文字列全体に一致し、<.+?> は <b> と </b> に別々に一致します。強欲な量指定子(*+、++)は貪欲で、決して文字を返しません。JavaScript、Go、.NET にはありません。

後読みに対応している言語は?

JavaScript(ES2018 以降)と .NET は任意の長さの後読みを使えます。Java は最大長に上限が必要なので、中に * や + は使えません。Python の re モジュールは固定長の後読みしか受け付けません。PCRE2 は 10.43 までは各選択肢が固定長である必要があり、10.43 で上限(初期設定は 255 文字)付きの可変長の後読みが追加されました。Go の RE2 エンジンには先読みも後読みもまったくありません。

アクセント付きの文字やラテン文字以外も含め、あらゆる文字に一致させるには?

Unicode プロパティ \p{L} を使います。JavaScript では u か v のフラグが必要で(/\p{L}+/u)、PCRE、Go、Java、.NET はそのまま対応しています。[a-zA-Z] は é、ß、ラテン文字以外のすべての文字体系を取りこぼし、\w は JavaScript と Go では ASCII のみです。Python の組み込みの re には \p{…} がないので、サードパーティの regex モジュールを使うか、Python 3 では Unicode の文字に一致する [^\W\d_] を使ってください。

置換でキャプチャしたグループを使うには?

言語によって異なります。JavaScript、Java、.NET、Go、PHP では $1、Python では \1 か \g<1> です。名前付きグループは、JavaScript では $<name>、Java、.NET、Go では ${name}、Python では \g<name> です。PHP の preg_replace には名前で参照する形がないので、番号を使ってください。一致全体は、JavaScript と .NET では $&、Java と PHP では $0、Python では \g<0> です。

正規表現が JavaScript では動くのに Python では動かない(またはその逆)のはなぜですか?

よくある原因は、名前付きグループ(JavaScript は (?<name>)、Python は (?P<name>))、\p{…} プロパティ(JavaScript は対応、Python の re は非対応)、後読みの長さ(JavaScript は任意、Python は固定)、インラインフラグ(先頭の (?i) は Python では使えますが、範囲付きの (?i:…) しかない JavaScript ではエラー)、そして \d や \w が Python では Unicode の数字や文字にも一致するのに JavaScript では ASCII だけ、という違いです。Python の文字列のエスケープにも注意してください。パターンは r"\d+" のように raw 文字列で書きます。

正規表現でメールアドレスを検証しても大丈夫ですか?

形の確認としてだけなら大丈夫です。[\w.+-]+@[\w-]+(?:\.[\w-]+)+ のような実用的なパターンは打ち間違いを見つけられますが、一部の有効なアドレス(引用符付きのローカル部、国際化ドメイン)を拒否し、一部の無効なアドレスを受け入れます。メールボックスが存在するかはどんなパターンでもわからないので、形はゆるく確認し、そのうえで確認メールを送ってください。

複数の言語で動くパターンの書き方

パターンを複数のエンジンで動かす必要がある場合(共有の検証ルール、異なる言語のサービスが読む設定ファイルなど)は、共通の部分集合の範囲にとどめてください。次のものは、このページの 6 つのエンジンすべてで同じように動作します。

• リテラル文字、\. や \$ のようなエスケープ、文字クラス [abc]、[^abc]、[a-z]。

• \d、\s、\w(入力が ASCII である限り。Python と .NET は Unicode の数字や文字にも一致します)。

• ^ と $、\b、選択、キャプチャするグループとしないグループ。

• 貪欲と怠惰な量指定子:*、+、?、{n}、{n,m} とそれぞれの ? 付きの形。

先読み・後読み(Go にはない)、後方参照(Go)、強欲な量指定子とアトミックグループ(JavaScript、Go、.NET にはどちらか、または両方がない)、名前付きグループ(Python は書き方が違う)、\p{…}(Python の re にはない)は避けてください。これらのどれかが必要なら、言語ごとにパターンを 1 つずつ用意し、それぞれをテストしてください。

壊滅的なバックトラックを避ける

バックトラック型のエンジン(JavaScript、PCRE、Python、Java、.NET)は、(a+)+$ や (\w|\d)*x のように、量指定子付きのグループが同じテキストに何通りもの方法で一致しうるパターンで、指数関数的な時間がかかることがあります。ほぼ一致する長い入力に対して、エンジンは失敗するまですべての分け方を試し、Web サーバーが 1 つのリクエストで固まってしまうこともあります。これが正規表現によるサービス拒否(ReDoS)の問題です。

対策は機械的です。同じ文字に対する量指定子を入れ子にしない、選択肢を互いに排他的にする、区切り文字がわかっているなら .*? より [^"]* のような否定文字クラスを使う、エンジンにあれば強欲な量指定子やアトミックグループを使う、一致させる前に入力の長さを制限する、などです。.NET には RegexOptions.NonBacktracking と一致のタイムアウトもあり、PCRE には設定できる一致の上限があり、Go の RE2 エンジンはバックトラックが必要な機能に対応しないことで線形時間を保証しています。

文字列内での正規表現のエスケープ

実際のコードの正規表現のバグの多くは、正規表現ではなく文字列のエスケープのバグです。バックスラッシュは言語の文字列リテラルと正規表現エンジンの両方にとって特別な文字なので、普通の文字列で書いたパターンにはバックスラッシュを 2 つ重ねる必要があります。

• JavaScript:リテラル /\d+/ ならバックスラッシュは 1 つ、new RegExp("\\d+") なら 2 つ必要です。String.raw`\d+` を使えば重ねずに済みます。

• Python:必ず r"\d+" のように raw 文字列を使ってください。そうしないと "\b" は単語境界ではなくバックスペース文字になります。

• Java と C#:普通の文字列では "\\d+"(Java のテキストブロックもエスケープを処理します)。C# の逐語的文字列 @"\d+" は、バックスラッシュを入力したとおりに保ちます。

• Go:regexp.MustCompile には、バッククォートの raw 文字列 `\d+` を使うのが標準です。

• PHP:パターンには区切り文字 '/\d+/' を含め、シングルクォートの文字列ではほとんどのバックスラッシュが入力したとおりに保たれます。

関連する無料ツール

  • 正規表現テスター — サンプルテキストに対して正規表現をテストし、マッチのハイライト、キャプチャグループ、置換のプレビューをリアルタイムで確認。無料、ブラウザ上で動作。
  • Git 早見表 — 直前のコミットの取り消し、ブランチ名の変更、リモートブランチの削除など、やりたいこと別に整理した Git コマンド。新しい switch/restore と従来のコマンド、危険度バッジ付き。
  • Markdown 早見表 — すべての Markdown 要素をソースと表示結果で掲載。拡張記法(表、タスクリスト、脚注、数式、Mermaid、アラート)、9 プラットフォームの対応表、ライブで試せるプレイグラウンド付き。
  • cron 式ジェネレーター — ドロップダウンから cron スケジュールを作成するか貼り付けると、わかりやすい日本語で読み、次の 10 回の実行時刻をローカル時刻と UTC で確認できます。無料、ブラウザで動作。
  • 差分チェッカー — テキスト、コード、JSON ファイルの 2 つのバージョンを比較し、どの行、単語、文字が変わったかを正確に確認できます。