正規表現テストツール
正規表現を書いてテスト用テキストを貼り付けると、マッチ箇所がその場でハイライトされます — キャプチャグループ、フラグ、わかりやすいエラー表示つき。
1,034回閲覧
0 件のマッチ
仕組み
正規表現は、リテラル文字列の代わりに文字のパターンを記述するもので、これにより短い1つの表現でテキストのグループ全体にマッチさせることができます — 任意のメールアドレス、複数の書式のいずれかに合う電話番号、ログファイル中の「ERROR」で始まる任意の行などです。JavaScriptの正規表現を入力し、フラグ(g すべてにマッチ、i 大文字小文字を無視、m 複数行アンカー、s ドットが改行にもマッチ、u 完全なUnicode処理)を切り替え、サンプルテキストを貼り付けると、すべてのマッチがその場でハイライトされ、位置とキャプチャグループとともに下に一覧表示されます。括弧()はキャプチャグループを作ります — これはマッチが起きたことを知るだけでなく、メールアドレスからドメイン部分、日付から年の部分など、マッチしたテキストの特定の一部だけを取り出す手段です。
ほとんどの人が最初につまずく区別が1つあります。貪欲(greedy)量指定子と怠惰(lazy)量指定子です。.*は貪欲です — できるだけ多くのテキストにマッチしようとし、必要な場合にのみバックトラックします。<b>bold</b> and <i>italic</i>という入力に対し、<.*>というパターンは最初の<から最後の>まで貪欲にマッチし、両方のタグを飲み込んでしまいます。?を加えて.*?にすると怠惰になります — できるだけ少なくマッチしようとするため、<.*?>は最初の>で止まり、正しく<b>だけにマッチします。素朴なHTMLマッチング用正規表現が実際のマークアップで壊れてしまう理由は、まさにこの違いにあります。
知っておくべきこと
ここで使われているエンジンは、お使いのブラウザ自身が持つネイティブのJavaScript(ECMAScript)正規表現実装です。そのため、ここでマッチするパターンは、あなたのJSコードでもまったく同じようにマッチします — 途中に変換層が入ることはありません。他の言語の正規表現方言 — PCRE(PHP)、Pythonのre、JavaのPattern — はコア構文(文字クラス、量指定子、グループ)の大部分を共有していますが、高度な機能では異なります。後読み(lookbehind)のサポート、名前付きグループの構文、所有量指定子、一部のエスケープシーケンスなどです。公開する前には、実際の対象言語でも必ずエッジケースを再テストしてください。
破滅的バックトラックにも注意してください。ネストしたり重なり合ったりする量指定子を持つパターン — 例えば末尾に「b」のない長い「a」の文字列に対してテストされる(a+)+b — は、エンジンを指数関数的なバックトラックに追い込み、ページ(あるいは同じ理由で本番サーバー)をフリーズさせることがあります。パターンがここで固まった場合は、まずテスト入力を短くし、それからパターン自体を作り直してください(多くの場合、ネストした繰り返しを完全に取り除くことで解決します) — 単にCPUパワーを増やして解決しようとするのではなく。すべての処理はブラウザ内でローカルに実行され、パターンもテキストも一切送信されません。
よくある質問
どの正規表現の方言を使っていますか?
JavaScript(ECMAScript)— ブラウザ純正のエンジンです。パターンはあなたのJSコードとまったく同じように動作します。PCREやPythonはほとんどの構文を共有しますが、一部の高度な構文は異なります。
フラグはそれぞれ何を意味しますか?
gは最初の一致だけでなくすべての一致を検索します。iは大文字小文字を無視します。mは^と$を行ごとに一致させます。sはドットが改行にも一致するようにします。uは完全なUnicode処理を有効にします。
なぜパターンを入れるとページがフリーズするのですか?
(a+)+bのようなネストした量指定子を含むパターンは、長い入力に対して破滅的なバックトラックを起こすことがあります。テストテキストを短くするかパターンを見直してください — 同じフリーズは本番コードでも発生します。
キャプチャグループとは何ですか?なぜ重要なのですか?
パターンの一部を括弧で囲むとキャプチャグループができ、マッチ全体とは別にその特定の部分文字列だけを取り出せます — 例えば(\d{4})-(\d{2})-(\d{2})を日付に対してマッチさせると、文字列全体が日付らしく見えることを確認するだけでなく、年・月・日を3つの個別のキャプチャとして得られます。(?:...)と書く非キャプチャグループは、余分なキャプチャを生成せずに構造だけをグループ化します。
なぜパターンが期待より多く(または少なく)マッチしたのですか?
ほとんどの場合、貪欲と怠惰の取り違えが原因です。.*などの量指定子はデフォルトでできるだけ多くマッチしようとします。?を加えて(.*?、+?)怠惰にすると、最後ではなく最初に可能な地点で止まるようになります。正規表現が複数行やタグにまたがって過剰にマッチしている場合、修正方法は通常このたった1文字です。
関連ツール
問題を報告
正規表現テストツール
コメント
まだコメントはありません — 最初のコメントを書いてみましょう!