正規表現テスター&デバッガー

リアルタイムのハイライト表示とcapture groupで正規表現をテストします。

データはデバイスから外に出ません

ハイライトされたマッチ

マッチの詳細

0 matches

クイックリファレンス

.改行以外の任意の文字 \d数字 (0-9) \w単語文字 (a-z, A-Z, 0-9, _) \s空白 (スペース、タブ、改行) ^文字列の先頭 (または mフラグ付きで行頭) $文字列の末尾 (または mフラグ付きで行末) *直前の文字の0回以上の繰り返し +直前の文字の1回以上の繰り返し ?直前の文字の0回または1回 {n,m}直前の文字のn回以上m回以下の繰り返し [abc]character class: a、b、または c [^abc]a、b、c以外 (abc)capture group (?:abc)non-capturing group a|baまたはb \b単語境界 (?=abc)肯定的lookahead (?!abc)否定的lookahead

正規表現について

正規表現 (regex) は、文字列内の文字の組み合わせにマッチさせるために使われるパターンです。プログラミング、テキスト処理、データ検証、検索操作において不可欠なツールです。主要なプログラミング言語はすべてregexをサポートしています · JavaScript、Python、Java、PHP、Ruby、Goなど。

このテスターはJavaScriptの組み込みRegExpエンジンを使用しており、lookahead、character class、量指定子、g、i、m、sフラグを含むECMAScript regex構文をサポートしています。マッチは入力中にリアルタイムでハイライトされ、capture groupはマッチ詳細パネルに表示されます。

一般的な用途

よくある質問

g、i、m、sフラグは何をしますか?

g(グローバル)は最初のマッチで停止せず、すべてのマッチを検索します。i(大文字小文字を区別しない)は大文字と小文字を区別しません。m(マルチライン)は^と$が各行の先頭/末尾にマッチするようにします。s(dotAll)は.が改行文字にもマッチするようにします。

このregexはPython / Java / PHPで動作しますか?

ほとんどのregex構文は言語間で共通です。ただし違いもあります · たとえば、JavaScriptはすべてのブラウザでlookbehindをサポートしているわけではありません(最新のブラウザではサポートされています)し、Pythonは異なるnamed group構文を使用します。基本的なパターンについては、ここで動作するものはどこでも動作します。

私のテストデータはどこかに送信されますか?

いいえ。regexマッチングはすべて、JavaScriptのネイティブRegExpエンジンを使用してブラウザ内でローカルに行われます。サーバーには何も送信されません。

regexテスターとは?

regexテスターは、サンプル文字列に対して正規表現を実行し、何が一致し、何が一致しなかったか、キャプチャグループに何が含まれているかを正確に示すインタラクティブエディタです。テスターは素早く反復することを可能にします: パターンを入力し、ハイライトを見て、調整し、繰り返します。ソースコードを編集し、スクリプトを実行し、コンソール出力を読むという遅いループを置き換えます。

正規表現自体は、Stephen Cole Kleeneが1956年に発明した、文字列の集合を記述するためのパターン構文です。現代の正規表現実装 (PCRE、JavaScriptのRegExp、Pythonのre、.NETのSystem.Text.RegularExpressions、Javaのjava.util.regex) はほとんどの構文を共有しますが、lookbehind、名前付きグループ、Unicode処理、量化子の動作などのエッジケースで異なります。

このテスターはブラウザのネイティブJavaScript RegExpエンジンを使用しており、すべての標準フラグ (g、i、m、s、u、y、d) と現代のlookbehindを含むECMAScript 2024正規表現を実装しています。出力はフロントエンドコードが実行時に見るものと正確に同じであり、クライアントサイド検証、スクレイピングセレクタ、replace-with-callback変換のデバッグ時にテスターを特に有用にします。

テスターの内部には何があるか

上の行にはスラッシュで囲まれたパターン入力があり、その後に最も使用される4つのフラグ (g、i、m、s) のトグルボタンが続きます。Patternsボタンは、クリックしてパターンフィールドに入力できる一般的な正規表現スニペット (email、URL、phone、date) のライブラリを開きます。裏では、入力はデバウンスされているため、再入力してもマッチャーが揺れません。

パターンの下では、Test Stringテキストエリアがサンプルテキストを貼り付ける場所です。マッチは、入力に応じて更新されるHighlighted Matchesパネルで黄色の背景でハイライトされます。Replace withフィールドはバックリファレンス ($1、$2など) を持つ置換文字列を受け入れ、結果のテキストをライブで表示します。コードに貼り付ける前に文字列置換変換をテストするのに最適です。

Match Detailsリストは、各マッチをソース内のゼロベースのインデックス、一致した部分文字列、およびすべてのキャプチャグループで示します。下部のQuick Referenceカードは、文字クラス、量化子、アンカー、lookaroundの構文を要約しているので、基本のためにドキュメントタブにコンテキスト切り替えする必要はありません。

歴史と背景

Stephen Cole Kleeneが正規イベントを定義 (1956)

数学者Stephen Cole Kleeneは1956年に論文Representation of Events in Nerve Nets and Finite Automataを発表し、彼が呼んだ正規イベント: 有限オートマトンによって受け入れられる文字列の集合を記述するパターンを導入しました。Kleeneスター (*演算子) は彼の名前を冠しています。彼の代数表記は今日使用されているすべての正規表現構文の直接の祖先です。

Ken Thompsonがgrepを出荷 (1968)

ベル研究所のKen Thompsonは1968年にQEDエディタ内で正規表現エンジンを実装し、1973年にはgrepでも実装しました。Unixユーティリティの名前はQEDコマンドg/regular-expression/pから来ています。ThompsonのNFAベースのエンジンは文字あたり線形時間で動作し、これは後にバックトラックエンジンがバックリファレンスのような機能を追加したときに失った保証でした。

Perl 5が拡張正規表現を導入 (1994)

Larry Wallは1994年にPerl 5をリリースし、lookahead、lookbehind、名前付きキャプチャ (後で)、インラインモディファイア、バックリファレンスを追加した正規表現フレーバーを持ちました。Perl 5正規表現は非常に支配的になり、他の言語がその構文をコピーしました。Philip Hazelは1997年にCライブラリとしてPCRE (Perl Compatible Regular Expressions) を作成し、PCREは今日PHP、Apache、NGINX、その他多くのツールで正規表現を動かしています。

JavaScriptがRegExpを出荷 (1995年、1999年に正式化)

Brendan Eichの1995年のJavaScript 1.0は、Perl 5をモデルにしたRegExpオブジェクトを搭載して出荷されました。ECMAScript第3版 (1999) は構文を正式化しました。後続のエディションでは、Unicodeフラグu (ES2015)、stickyフラグy (ES2015)、名前付きグループ (ES2018)、lookbehind (ES2018)、indicesフラグd (ES2022) が追加されました。ブラウザは時間とともに追いつき、現代のエンジン (V8、SpiderMonkey、JavaScriptCore) は完全なES2024仕様を実装しています。

ReDoS、正規表現サービス拒否 (2003年以降)

研究者たちは、バックトラッキング正規表現エンジンが特定の入力で指数関数的時間を要する可能性があることに気付きました、これはReDoS (Regular expression Denial of Service) と呼ばれる脆弱性のクラスです。2019年のCloudflareの停止は壊滅的なバックトラッキングを持つ正規表現に追跡されました。rxxrやnode-re2のようなツールが問題を検出または回避するために登場し、エンジンは長時間実行されているマッチに時間予算を強制し始めました。

UnicodeプロパティエスケープがECMAScriptに登場 (2018)

ES2018はUnicodeプロパティエスケープ\p{Script=Latin}や\p{Letter}を追加しました、これによりコードポイントを列挙せずにUnicodeカテゴリでマッチングできます。uフラグと組み合わせると、正規表現は今や絵文字を文字から、スクリプトを互いから区別し、サロゲートペアを適切に処理できます。これにより、JavaScriptの正規表現がついに国際テキストマッチングに適したものになりました、これは古いASCII専用構文では解決できなかった問題です。

実用的なワークフロー

メール検証

有効なメールと無効なメールのサンプルをテストエリアに落とし、候補の正規表現を入力し (一般的な開始点は^[^@\s]+@[^@\s]+\.[^@\s]+$)、有効なメールがハイライトされ無効なものがハイライトされないように微調整します。完全なRFC 5321メール仕様は非常に複雑で、完璧なメール正規表現は数百文字の長さであることに注意してください。実用的な正規表現はタイプミスをキャッチします; 最終的な検証は実際のSMTPを通じてラウンドトリップする必要があります。

URL解析と抽出

HTMLまたはプレーンテキストのページを貼り付け、URLを抽出する正規表現を書きます。https?:\/\/\S+のような開始パターンはほとんどの場合をキャッチします。本番コードでは、すべてのエッジケースを処理するURLコンストラクタ (new URL(string)) を優先します; 正規表現は素早い一度限りの抽出やログ分析に最適です。

ログファイルスクレイピング

ApacheとNGINXのログは固定形式に従います。いくつかのログ行を貼り付け、名前付きキャプチャ ((?\S+) (?\S+ \S+) \"(?[^"]+)\" ...) を持つ正規表現を書けば、構造化ログアナライザーに供給する準備ができたパーサーがあります。デプロイ前に実際のログのサンプルでテストしてください。

コードエディタでの検索と置換

VSCode、Sublime Text、JetBrains IDE、vimはすべてfind-replaceダイアログで正規表現を受け入れます。ライブハイライタが正確に何がマッチするかを示しながら、ここでまずパターンを反復し、その後正規表現をエディタのダイアログに貼り付けます。5,000行のコードベースでの失敗の痛みを免れます。

CSSクラス名のWebスクレイピング

パーサーなしでHTMLからデータを抽出する必要がある場合 (本番ではなく、一度限りのスクリプト)、class="([^"]+)"のような正規表現はclass属性を抽出します。素早い探索を超える何かには、適切なDOMライブラリに切り替えてください; HTMLは正規言語ではなく、正規表現はエッジケースを見逃します。

セマンティックバージョン文字列の検証

Semverは^\d+\.\d+\.\d+(-[\w.]+)?(\+[\w.]+)?$に従います。バージョンのリスト (1.0.0、1.2.3-beta.1+build.456) をテストエリアに落として、正規表現がプリリリースとビルドメタデータを正しくキャッチすることを確認します。これはCIスクリプトで依存関係を検証するときに便利です。

よくある落とし穴

Greedy vs lazy量化子

デフォルトで*、+、?はgreedy: 可能な限り多くをマッチし、その後正規表現の残りが失敗するとバックトラックします。lazyバージョンの*?、+?、??は可能な限り少なくマッチします。古典的な例はtextの<.*>で、これは文字列全体をマッチしますが、<.*?>はを別々にマッチします。オーバーマッチングのサプライズを避けるために正しいものを選んでください。

壊滅的なバックトラッキング (ReDoS)

(a+)+や(.*)*のようなネストされた量化子は、長いマッチしない入力で指数関数的時間を要する可能性があり、エンジンがすべての組み合わせを試みます。ブラウザのタブが固まったりクラッシュしたりする可能性があります。重複する量化子グループを避け、サポートされている場合は原子グループ (?>...) を優先し、入力長を事前検証してください。npmライブラリsafe-regexは自動的にリスクのあるパターンをフラグ付けします。

特殊文字はエスケープが必要

正規表現で特殊な意味を持つ文字 (. * + ? ^ $ ( ) [ ] { } | \) は、リテラルにマッチするためにバックスラッシュでエスケープする必要があります。だから\.はドットをマッチしますが、.は任意の文字をマッチします。エスケープを忘れることは、IP、ファイル拡張子、ドット付きバージョン番号を検証するときに偽陽性の最も一般的な原因です。

アンカーとmultilineフラグ

mフラグなしでは、^と$は文字列全体の始まりと終わりのみをマッチします。mがある場合、各行の始まりと終わりをマッチします。正規表現が単一行で動作するが複数行入力で失敗する場合、mを切り替えてください。逆に、複数行入力でマッチしすぎる場合、mを削除してください。

エンジン間の構文の違い

このテスターはJavaScript正規表現を使用します。Pythonのreは(?)の代わりに(?P)を名前付きキャプチャに使用し、.NETはバックリファレンス\kを異なって許可し、PCREはJavaScriptに欠けている再帰サブパターン(?R)のような機能を持っています。最終的なターゲットがPythonまたはJavaの場合、出荷前にそれらのエンジンでも検証してください。

uフラグなしのUnicode

uフラグなしでは、JavaScript正規表現はサロゲートペア (絵文字、CJK補助) を2つの別々のコードユニットとして扱います。\u{1F600} (笑顔の絵文字) はuなしでは機能しません。uフラグがあれば、正規表現はUnicode-awareになり、\p{Letter}のようなプロパティエスケープが利用可能になり、サロゲートペア処理が正しくなります。国際テキストをマッチするときは常にuを設定してください。

プライバシーとデータ取り扱い

すべての正規表現はブラウザのRegExpエンジンによってコンパイルされ実行されます。あなたのパターン、テスト文字列、置換テンプレートをサーバーに送信しません。マッチャーはローカルで動作し、ハイライトはローカルでレンダリングされ、Match Detailsリストはローカルで計算されます。入力の内容に結びついたアナリティクスはありません。

ページが読み込まれると、テスターはオフラインで動作します。ネットワークから切断し、機密ログ行やPIIを貼り付け、それらに対してパターンを実行することができます、データがデバイスを離れることなく。これにより、サードパーティサービスを通さずに本番データに対して正規表現をテストするのに安全なツールになります。

正規表現を使わないとき

HTMLまたはXMLの解析

HTMLは正規言語ではありません。正規表現で信頼できる方法でネストされたタグを解析することはできません; ZalgoとCthulhuに関する有名なStack Overflowの回答はこの点を色鮮やかに示しています。代わりにDOMParserやcheerio (Node.js) やBeautifulSoup (Python) のようなライブラリを使用してください。正規表現は一度限りの抽出には適していますが、self-closingタグ、コメント、CDATA、不正な入力のようなエッジケースで壊れます。

本当に再帰的なもの (JSON、ソースコード、数式)

バランスの取れた中括弧、バランスの取れた括弧、ネストされた関数呼び出し、算術優先順位、すべて文脈自由文法を必要とし、正規文法ではありません。パーサーコンビネータ (Parsimmon、nom) またはジェネレータ (pegjs、antlr) を使用してください。正規表現は開始または終了トークンをマッチできますが、バランスを追跡することはできません。

シンプルな文字列操作で十分なとき

文字列がprefix-で始まるかどうかを確認する必要がある場合、/^prefix-/ではなくstr.startsWith("prefix-")を使用してください。文字列メソッドは高速で、明確で、量化子で間違うことが不可能です。正規表現は文字列メソッドが表現できないパターンのために予約してください。

複雑なスキーマ検証

JSONドキュメントが特定の形状 (必須フィールド、ネストされた型、値の範囲) を持っていることを検証することは、正規表現よりもJSON Schemaバリデーター (ajv、zod、joi) ではるかに優れています。正規表現は形式をチェックできますが構造はチェックできず、JSONドキュメントを検証しようとする正規表現はメンテナンスの悪夢です。

その他の質問

lookahead vs lookbehindをいつ使うべきですか?

lookahead (?=...) は、消費せずに後続がマッチすることを主張します; lookbehind (?<=...) は先行に対して同じことをします。後続のコンテキストがマッチするかどうかを決定する場合はlookaheadを使用し、先行のコンテキストが決定する場合はlookbehindを使用します。JavaScriptは2018年 (ES2018) から両方をサポートし、すべての現代のブラウザがそうします。16.4より前の古いSafariバージョンはlookbehindサポートを欠いていました。

lookbehindはすべてのブラウザでサポートされていますか?

lookbehind (肯定と否定) はChrome 62 (2017) 以降、Firefox 78 (2020) 以降、Edge 79 (2020) 以降、Safari 16.4 (2023) 以降でサポートされています。あなたのオーディエンスが古いSafariを使用する可能性がある場合、lookbehindを避けるか、代替パターンでポリフィルしてください。Node.jsでは、lookbehindは10.0からサポートされています。

Unicode (u) フラグは何をしますか?

uフラグはUnicodeモードを有効にします: サロゲートペアは単一文字として扱われ、\u{...}エスケープが機能し、\p{...}プロパティエスケープが利用可能になります。uなしでは、笑顔の絵文字のような絵文字は2つのコードユニットとしてカウントされ、.は最初の半分のみをマッチします。ASCIIを超えるテキストで作業するときは常にuを設定してください。

正規表現エンジンはどれくらい高速ですか?

V8のRegExpエンジンはネイティブコードにコンパイルするIrregexp実装を使用しています。シンプルなパターンの場合、毎秒数百万文字をマッチします。病理学的パターン (敵対的入力でのネストされた量化子) は指数関数的時間に爆発する可能性があり、これがReDoSが本当の攻撃ベクトルである理由です。現代のエンジンはランナウェイマッチを検出して中止するヒューリスティックを適用しますが、それでもリスクのあるパターンを避けるべきです。

JavaScriptとPythonの正規表現はどう違いますか?

名前付きグループは異なる構文を使用します (JSでは?、Pythonでは?P)。Pythonはy (sticky) フラグを欠いています; JavaScriptはPythonのverboseモードを欠いています。Pythonはサードパーティのregexモジュールを介して再帰をサポートしますが、組み込みのreではサポートしません。文字クラスのショートハンドはわずかに異なります (\dは両方で[0-9]を意味しますが、PythonのUnicodeモードでの\wはアンダースコアを含み、JSは同じ動作のためにuフラグを必要とします)。

代わりにAIを使って正規表現を生成できますか?

LLMは初期の正規表現パターンを提案するのが得意ですが、日常的に微妙に間違った出力を生成します (lazyが必要だったところがgreedy、エスケープ漏れ、間違ったフラグ)。AIを最初のドラフトに使用し、その後このテスターで実際のサンプルに対して正規表現を実行して検証してください。ハイライトが期待するものと正確に一致するまで反復してください。インタラクティブフィードバックループは、本番に出荷される前にLLMのミスをキャッチします。

関連ツール