表示言語: 日本語 英語に切り替え

正規表現テスター

JavaScriptの正規表現をライブでテスト。マッチがハイライトされ、キャプチャグループが一覧表示されます。

/ /

ハイライトされたマッチ

 

マッチとグループ

  1. 上のフィールドにregexパターンを入力 (スラッシュで囲む必要はありません)。
  2. 必要なフラグを切り替え: すべてのマッチ用にg、大文字小文字を区別しない用にi、など。
  3. テスト文字列ボックスにテスト文字列を貼り付けまたは入力。
  4. マッチがリアルタイムでハイライトされるのを確認。下の表でキャプチャされたグループを検査。
何ができるのか?

このテスターはブラウザのネイティブRegExpエンジン — Node.js、Deno、すべてのブラウザが使用しているのと同じもの — を使ってテスト文字列に対してパターンを実行します。マッチはインラインでハイライトされます。番号付きと名前付きのキャプチャグループはテーブルに抽出されるので、各括弧セグメントが何をキャプチャしたか正確にわかります。

パターン (flag g付き):

\b(\w+)@(\w+\.\w+)\b

テスト文字列:

Contact us at [email protected] or [email protected]. Not an email: foo@bar (no TLD).

マッチ:

1  [email protected]        $1: hello    $2: example.com
2  [email protected]   $1: support  $2: happycoder.dev

foo@barはマッチしません。なぜなら\w+\.\w+はドメインにドットを必要とするから。

なぜ私のregexがマッチしないのか?

  • gフラグを忘れた。 それがないと最初のマッチだけが返されます。/cat/.exec("cat cat") は"cat"を1つ見つけます; /cat/gは両方見つけます。
  • エスケープされていないメタ文字。 example.comはexamplexcomにもマッチします、なぜなら.は任意の文字にマッチするから。エスケープ: example\.com。
  • 貪欲マッチが消費しすぎる。 <a><b>上の<.*>は全部をキャプチャします。最初の>で止めるにはlazy <.*?> または<[^>]*>を使用。
  • 単語境界の混乱。 \bは単語文字と非単語文字の間の位置です。\bfoo-bar\bのようなパターンは失敗します。なぜなら-は真ん中ですでに非単語境界だから。
  • 大文字小文字の不一致。 [a-z]+はHelloにマッチしません。iフラグを追加するか[A-Za-z]+を含める。
  • 複数行 ^ / $。 mフラグなしだと文字列全体にのみアンカーし、各行にはアンカーしません。ログ行をスキャンする場合はmをオンに。
よくある質問

このテスターはどのregexフレーバーを使用していますか?

JavaScript (ECMAScript) regex、ブラウザ組み込みのRegExpエンジン経由。これはPCRE (PHP、Perl)、Pythonのreモジュール、POSIX regexといくつかの点で異なります: 再帰なし、所有量指定子なし、名前付きグループは(?P<name>...)の代わりに(?<name>...)を使用、\dのような文字クラスの短縮形はuフラグを追加しない限りASCIIのみ。

lookbehindをサポートしていますか?

はい。(?<=foo)barや(?<!foo)barのようなlookbehindアサーションはES2018で追加され、現在のすべてのChromium、Firefox、Safariビルドでサポートされています。本番で非常に古いブラウザを対象としている場合、それらに依存する前にcaniuseを確認してください — ただしこのテスター自体はそれらを問題なく実行します。

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

gは最初のだけでなくすべてのマッチを見つけます。iはマッチングを大文字小文字を区別しなくします。mは^と$を文字列全体の代わりに各行の先頭と末尾にマッチさせます。s (dotall) は.を改行にマッチさせます。uは完全なUnicode処理とより厳密なescape解析を有効にします。必要なフラグだけを選んでください — 特にgは取得するマッチの数を変えます。

なぜ私の貪欲量指定子が多くマッチしすぎるのか?

*、+、{n,}のような量指定子はデフォルトで貪欲 — できるだけ多くマッチし、パターンの残りが失敗したときだけ戻します。lazyにするには?を追加: .*?はできるだけ少なくマッチします。複数のタグにまたがる<a>.*</a>の一般的な修正: <a>.*?</a>または否定クラス<a>[^<]*</a>を使用。

パターンまたは置換で後からキャプチャしたグループをどう参照しますか?

パターン内で、前のグループがキャプチャした同じテキストにマッチするには\1、\2などを使用 — (\w+)\s+\1は繰り返し単語にマッチします。置換文字列内 (このライブテスターではサポートされていませんが、String.replaceで) は$1、$2を使用。名前付きグループはパターン内で\k<name>、置換で$<name>を使用。

パターンにドット、スラッシュ、括弧が含まれると、なぜregexが壊れるのか?

それらはregexメタ文字です。それらに文字通りマッチするには、バックスラッシュでエスケープ: ドットには\.、スラッシュには\/ (new RegExp文字列では任意、/.../ literals間では必須)、括弧には\(と\)。特殊文字は. * + ? ^ $ { } ( ) | [ ] \ — これらのいずれかを文字通りのテキストとして使うにはエスケープが必要。

ここで入力したregexやテストテキストを保存しますか?

いいえ。書いたパターンやテストしたテキストは保存しません。入力した内容はタブを閉じるかリフレッシュした瞬間にすべて破棄されます — ログなし、マッチしたものについて当方には記録なし。追加の安心が欲しい場合、ブラウザの開発者ツールで確認できます。