正規表現早見表 — すべてのトークンを例付きで解説
正規表現のすべてのトークンを、動作する例、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。
文字とエスケープ
ほとんどの文字はその文字自身に一致します。次の 12 文字は特別な意味を持つため、文字どおりに一致させるにはバックスラッシュが必要です:\ ^ $ . | ? * + ( ) [ {(位置によっては ] } も)。
.任意の 1 文字改行以外の任意の 1 文字。改行も含めるには s(dotAll)フラグを付けます。
/h.t/g
対象 “hat hot h t hit h↵t”
一致 “hat” “hot” “h t” “hit”- 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”\t \n \rタブ、改行、復帰制御文字を名前で表します。Windows の改行コードは \r\n なので、\r?\n で両方の形式に一致します。
/\w+\t\w+/g
対象 “name⇥age↵ana⇥31”
一致 “name⇥age” “ana⇥31”\xhh16 進コードで指定する文字16 進数ちょうど 2 桁。\x41 は A、\x20 はスペースです。
/\x41/g
対象 “A b A”
一致 “A” “A”\uhhhhUnicode コード単位で指定する文字基本多言語面(BMP)の文字を 16 進数 4 桁で指定します。\u00e9 は é です。
/\u00e9/g
対象 “café résumé”
一致 “é” “é” “é”- PCRE / PHP: \x{e9} を使います。
- Go RE2: \x{e9} を使います。
\u{1F600}任意のコードポイント(BMP 外も可)コードポイントを波括弧で囲みます。絵文字など U+FFFF を超える文字に必要です。JavaScript では u または v フラグが必要です。
/\u{1F600}/gu
対象 “Hi 😀 there 😀”
一致 “😀” “😀”- 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”[^abc]いずれでもない 1 文字リストにない 1 文字(^ は先頭以外では文字どおり)。改行にも一致します。
/[^aeiou\s]/g
対象 “regex”
一致 “r” “g” “x”[a-z]範囲2 つのコードポイントの間の文字。範囲は組み合わせられ、[A-Fa-f0-9] は 16 進数の 1 桁です。先頭または末尾の - は文字どおりです。
/[A-Fa-f0-9]+/g
対象 “x: 3fA9 zz”
一致 “3fA9”\d \D数字/数字以外\d は数字、\D はそれ以外。
/\d+/g
対象 “Order 66, room 101”
一致 “66” “101”- 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”- 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”
一致 “ ” “⇥”- Go RE2: ASCII の空白のみ:\t \n \f \r とスペース。
[[:alpha:]]POSIX ブラケット表現[:alpha:]、[:digit:]、[:space:]、[:punct:] などの名前付きクラス。角括弧の中で使います。
[[:alpha:]]+- 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”- PCRE / PHP: PCRE2 10.45 以降のみ。(?[ … ]) の拡張クラス構文を使います。
- Java: 積集合は [a-z&&[^aeiou]]。差集合は否定との積集合として書きます。
- .NET: 差集合は [a-z-[aeiou]]。積集合はなし。
アンカーと境界
アンカーは文字ではなく位置に一致するため、テキストを消費しません。
^ $文字列の先頭/末尾(m 付きなら行)m フラグなしでは ^ と $ は入力全体の先頭と末尾、m フラグありでは各行の先頭と末尾です。
/^\w+/gm
対象 “first line↵second line”
一致 “first” “second”- PCRE / PHP: $ は末尾の \n の直前にも一致します。
- Python re: $ は末尾の \n の直前にも一致します。
- Java: $ は末尾の行終端文字の直前にも一致します。
- .NET: $ は末尾の \n の直前にも一致します。
\b単語境界単語構成文字とそれ以外の文字(または入力の端)の間。単語全体に一致させるときに使います。
/\bcat\b/g
対象 “cat concat cats cat.”
一致 “cat” “cat”- JavaScript: u フラグを付けても ASCII の単語構成文字のみ。
- Go RE2: ASCII の単語構成文字のみ。
\B単語境界以外単語の内部。例えば「cat」がより長い単語の一部である場合にだけ一致します。
/\Bcat/g
対象 “concat cat bobcat”
一致 “cat” “cat”\A \z \Z絶対的な先頭/末尾複数行モードに関係なく、入力の先頭と末尾。\Z は末尾の改行も許容します(Python は例外で、\z と同じ意味)。
\A\d+\z- JavaScript: m フラグなしで ^ と $ を使います。
- Python re: \A と \z(3.14 以降)。\Z は他の言語の \z と同じく絶対的な末尾を表します。
- Go RE2: \A と \z。\Z はなし。
\G直前の一致の終わり直前の一致が終わった位置。連続した並びに一致させるときに使います。
\G\d- JavaScript: \G はなし。y(sticky)フラグで「ちょうどここから始める」同じ動作になります。
量指定子:最長一致、最短一致、強欲
量指定子は直前の要素を繰り返します。最長一致(デフォルト)はできるだけ多く取ってから戻り、最短一致(? を付ける)はできるだけ少なく取り、強欲(+ を付ける)は決して戻りません。
*0 回以上0 回から無制限に繰り返します。
/ba*/g
対象 “b ba baaa”
一致 “b” “ba” “baaa”+1 回以上1 回から無制限に繰り返します。
/lo+l/g
対象 “lol loool ll”
一致 “lol” “loool”?省略可能0 回または 1 回。
/colou?r/g
対象 “color colour colouur”
一致 “color” “colour”{n}ちょうど n 回ちょうど n 回繰り返します。
/\d{3}/g
対象 “12 345 6789”
一致 “345” “678”{n,}n 回以上少なくとも n 回繰り返します。
/\d{2,}/g
対象 “1 22 333”
一致 “22” “333”{n,m}n 回以上 m 回以下n 回から m 回、できるだけ多く繰り返します。
/\d{2,3}/g
対象 “1 22 4444”
一致 “22” “444”- Go RE2: 1000 を超える回数はエラーになります。
{,m}m 回以下0 回から m 回。受け付けるのは一部のエンジンだけで、それ以外では文字どおりの「{,m}」かエラーになります。{0,m} ならどこでも使えます。
\d{,3}- 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>”*? +? ?? {n,m}?最短一致(非貪欲)できるだけ短く一致させます。パターンが「一致しすぎる」ときはたいていこれで解決します。
/<.+?>/g
対象 “<b>bold</b>”
一致 “<b>” “</b>”- Go RE2: 最長一致と最短一致を入れ替える U フラグとしても使えます。
*+ ++ ?+強欲な量指定子バックトラックしない最長一致。一度一致した文字は決して戻しません。失敗が速く、壊滅的なバックトラックの防止策にもなります。
"[^"]*+"- 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”(?: … )非キャプチャグループ保存せずにまとめるだけなので、グループ番号が変わらず、処理も少し軽くなります。
/(?:ab)+/g
対象 “ababab ab a”
一致 “ababab” “ab”(?<name> … )名前付きグループ名前を付けてキャプチャし、後から読み出せます(JavaScript では match.groups.name)。
/(?<year>\d{4})-(?<month>\d{2})/g
対象 “Released 2026-10”
一致 “2026-10”- 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”- Go RE2: RE2 には後方参照がありません(線形時間の保証が崩れるため)。
\k<name>名前による後方参照\1 と同じですが名前で指定します。この例は対になった引用符で囲まれたテキストに一致します。
/(?<q>['"]).*?\k<q>/g
対象 “say "hi" or 'yo'”
一致 “"hi"” “'yo'”- PCRE / PHP: \k{name}、\g{name}、(?P=name) も可。
- Python re: (?P=name) と書きます。
a|b選択(OR)どちらか一方。選択肢は左から順に試されるため、一方が他方の接頭辞になる場合は長いほうを先に置きます。
/cat|dog/g
対象 “hotdog catalog”
一致 “dog” “cat”(?> … )アトミックグループグループが一度一致すると、エンジンはその中へバックトラックしません。
(?>a|ab)c- Python re: Python 3.11 以降。
- Go RE2: 不要:RE2 はバックトラックしません。
(?i) (?i: … )インラインフラグパターン内でフラグをオン/オフします。(?i) はパターンの残り全体に、(?i:…) はそのグループだけに適用され、(?-i:…) はフラグをオフにします。
/(?i:hello) world/g
対象 “HELLO world HELLO WORLD”
一致 “HELLO world”- JavaScript: 範囲を限定した (?i:…)/(?-i:…) 形式のみで、i、m、s に対応(ES2025)。先頭の (?i) は構文エラーです。
- Python re: グローバルな (?i) はパターンの一番先頭に置く必要があります(3.11 以降、それ以外の位置ではエラー)。(?i:…) はどこでも使えます。
(?(1)yes|no)条件分岐グループ 1 が一致に参加していれば「yes」、そうでなければ「no」に一致します。
(<)?\w+(?(1)>)(?R) (?1)再帰/サブルーチンパターン全体やグループに再び入ります。対応の取れた括弧のような入れ子構造に使います。
\((?:[^()]|(?R))*\)- Python re: サードパーティの regex モジュールで使えます。
- .NET: 再帰はなし。バランスグループ (?<open-close>…) で入れ子を扱います。
(?# … )インラインコメントエンジンに無視されます。長いコメントには x(拡張)フラグを使います。
\d{3}(?#area code)先読みと後読み
先読み・後読みは、現在位置の隣に何があるかを、一致には含めずに確認します。アンカーと同じく幅ゼロです。
(?= … )肯定先読み後ろに … が続く(一致には含まれない)。
/\d+(?=px)/g
対象 “10px 20em 30px”
一致 “10” “30”- Go RE2: RE2 には先読み・後読みが一切ありません。
(?! … )否定先読み後ろに … が続かない。中の \d により、チェックを通すためにエンジンが数字を戻すのを防いでいます。
/\d+(?!px|\d)/g
対象 “10px 20em”
一致 “20”(?<= … )肯定後読み前に … がある(一致には含まれない)。
/(?<=\$)\d+(?:\.\d\d)?/g
対象 “Cost: $42.50 or 42”
一致 “42.50”- JavaScript: 任意の長さ(ES2018)。
- PCRE / PHP: 各選択肢の長さに上限が必要。PCRE2 10.43 以降は可変長(初期設定で最大 255)に対応。
- Python re: 固定長のみ:(?<=ab|cd) は可、(?<=a+) はエラー。
- Java: 長さに上限があるもののみ:中に * や + は使えません。
- .NET: 任意の長さ。
(?<! … )否定後読み前に … がない。
/(?<!\$)\b\d+\b/g
対象 “$30 and 45”
一致 “45”- PCRE / PHP: 長さの規則は肯定後読みと同じ。
- Python re: 固定長のみ。
- Java: 長さに上限があるもののみ。
\K一致開始位置のリセットそれまでに一致した部分をすべて結果から外します。長さ制限のない後読みとして使えます。
price: \K\d+- JavaScript: (?<=…) かキャプチャグループを使います。
フラグ(修飾子)
JavaScript ではフラグを閉じスラッシュの後に書きます(/x/gi)。他の言語では定数(re.I、Pattern.CASE_INSENSITIVE、RegexOptions.IgnoreCase)を渡すか、インラインの (?i) を使います。
gグローバル(すべての一致)最初の一致で止まらず、すべての一致を探します。matchAll と replaceAll では必須です。
/o/g
対象 “foo boo”
一致 “o” “o” “o” “o”- 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”- 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”- Python re: re.M/re.MULTILINE。
- .NET: RegexOptions.Multiline。
sドットが改行にも一致. が改行にも一致するようになります。このフラグがない場合、どこでも使える「任意の文字」は [\s\S] です。
/<p>.*?</p>/gs
対象 “<p>a↵b</p>”
一致 “<p>a↵b</p>”- Python re: re.S/re.DOTALL。
- Java: Pattern.DOTALL。
- .NET: RegexOptions.Singleline という名前です。
x拡張(フリースペーシング)パターン内の空白が無視され、# 以降がコメントになるため、長いパターンを複数行に分けて書けます。
(?x) \d{3} - \d{4} # local number- Python re: re.X/re.VERBOSE。
- Java: Pattern.COMMENTS。
- .NET: RegexOptions.IgnorePatternWhitespace。
uUnicode入力をコードポイント単位で扱い(. が絵文字全体に一致する)、\p{…} と \u{…} を有効にし、無効なエスケープをエラーにします。
/^.$/gu
対象 “😀”
一致 “😀”- 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”yスティッキー各一致は直前の一致が終わった位置(lastIndex)から始まる必要があります。トークナイザーに便利です。
/\d/gy
対象 “12a3”
一致 “1” “2”- PCRE / PHP: \G を使います。
- Python re: pattern.match(text, pos) を使います。
- Java: \G または matcher.lookingAt() を使います。
- .NET: \G を使います。
d一致位置のインデックス各キャプチャグループの開始・終了位置を含む match.indices を追加します(ES2022)。
/(?<y>\d{4})/d- 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é” “東京”- 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”\P{…}プロパティに含まれない大文字の P で否定になります。\P{L} は文字(レター)以外すべてです。
/\P{L}+/gu
対象 “abc-123”
一致 “-123”\pL1 文字の短縮形1 文字のカテゴリは波括弧なしで書けます。
\pL+- JavaScript: 波括弧が必須:\p{L}。
- .NET: 波括弧が必須:\p{L}。
\p{Script=Greek}用字(スクリプト)1 つの文字体系に属する文字。sc= は短縮形です。Script_Extensions(scx=)は複数の用字で共有される文字も含みます。
/\p{Script=Greek}+/gu
対象 “alpha α, beta β”
一致 “α” “β”- 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 中文”
一致 “東京” “中文”- 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 👨👩👧!”
一致 “👍🏽” “👨👩👧”- PCRE / PHP: 最近の PCRE2(10.40 以降)では Boolean プロパティで単独のコードポイントに一致。シーケンス用のプロパティはなし。
- Java: \p{IsEmoji} は単独のコードポイントに一致(Java 21 以降)。
\X書記素クラスターユーザーが 1 文字と認識する単位。例:e と結合アクセント記号、国旗の絵文字。
\X- JavaScript: 書記素への分割には Intl.Segmenter を使います。
- Python re: regex モジュールで使えます。
置換文字列の記法
置換文字列に書く内容です。言語による違いが最も大きい部分なので、JavaScript の例よりも、使っている言語の列のほうが重要です。
$&一致全体一致したテキスト全体を挿入します。
/\d+/g
対象 “3 apples, 12 pears”
置換後 “[$&]” → “[3] apples, [12] pears”- 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”- 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”- 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”- PCRE / PHP: 後ろに数字や { が続かない $ はそのまま文字として扱われます。その後に続ける場合は ${1} と書きます。
- Python re: $ は特殊文字ではありません。バックスラッシュは \\ とエスケープします。
- Java: \$(Matcher.quoteReplacement() で文字列全体をエスケープできます)。
$` $'一致の前/後のテキスト一致の前または後の入力を挿入します。めったに使いませんが、ときどき便利です。
/=/
対象 “key=value”
置換後 “ is set ($') and was ($`) ” → “key is set (value) and was (key) value”よく使うレシピ(注意点つき)
特によく検索されるパターンを、読みやすく壊滅的なバックトラックが起きないように書いています。それぞれ、できないことも明記しています。
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)は通してしまいます。メールボックスが実在するかは正規表現ではわかりません。確認メールを送りましょう。
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())を使い、プロトコルとホストを確認してください。
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)を使いましょう。
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 も通ります。存在しない日付を弾くには日付ライブラリでパースしてください。
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 日です。どちらの意味かは正規表現にはわかりません。
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 形式で保存しましょう(次の行)。
Phone (E.164)国際形式 +CC…プラス記号、0 で始まらない国番号、合計 15 桁まで。
/^\+[1-9]\d{1,14}$/gm
対象 “+14165550199↵+447911123456↵0044791112”
一致 “+14165550199” “+447911123456”注意: E.164 の形式を確認するだけで、番号が割り当て済みか、その国として正しい桁数かは確認しません。
Hex colour#rgb、#rgba、#rrggbb、#rrggbbaaCSS で使える 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 など、長いテキストの一部にも一致します。単一の値を検証するには ^…$ で固定してください。
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 スラッグ生成ツールを使いましょう。
Trim whitespace前後の空白空文字列で置換します。m フラグなしでは、^ と $ はテキスト全体の両端です。
/^\s+|\s+$/g
対象 “ padded text ”
置換後 “” → “padded text”注意: 最近の言語にはどれも組み込みの trim() があり、そのほうが速くてわかりやすいです。正規表現はコードを呼び出せない場面(エディター、設定ファイル)でだけ使いましょう。
Collapse spaces連続する空白を 1 つに2 つ以上連続するスペースやタブを 1 つのスペースに置換します。
/[ \t]{2,}/g
対象 “too many ⇥ spaces”
置換後 “ ” → “too many spaces”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」は英語として正しい場合もあります。
Password rules小文字・大文字・数字を含む 12 文字以上各先読みが先頭から 1 つずつ条件を確認し、.{12,} で長さを指定します。
/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{12,}$/gm
対象 “short1A↵alllowercase123↵GoodPassword42”
一致 “GoodPassword42”注意: NIST SP 800-63B は文字種の組み合わせルールを推奨していません。代わりに長さを必須にし、漏えいしたパスワードのリストと照合しましょう。
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)は弾かれます。
静的なリファレンスです。検索と絞り込みはブラウザ内で行われ、「試す」リンクはブラウザ上で動く正規表現テスターを開きます。 すべての無料ツールを見る.
不具合や改善できそうな点を見つけましたか?いただいたメッセージはすべて読み、すぐに対応します。
この正規表現チートシートは、\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 で動作するので、他の言語では注記を読み、リリース前にその言語でテストしてください。
使い方
- トークン(\b、先読み)や作業(メール、空白の除去、重複語)で検索するか、上部のチップからセクションに移動します。
- 方言バーで使う言語を選びます。対応していないトークンは薄く表示され、各項目の下の注記にはその言語での代わりの書き方が示されます。
- 「正規表現テスターで試す」をクリックすると例がその場で動作し、そこでパターンやテキストを編集できます。
- 項目の横の # を使うとその項目に直接リンクでき、「印刷 / 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 つのバージョンを比較し、どの行、単語、文字が変わったかを正確に確認できます。