RevealTheme logo

正規表現テスター

JavaScriptの正規表現を任意の入力に対してテストします。一致箇所、グループ、置換結果をリアルタイムで確認できます。

0 件の一致

このツールの使い方

  1. 1

    Type your regular expression into the pattern field (no slashes — enter the bare pattern).

  2. 2

    Set the flags in the small field beside it, such as g, i, m, or a combination like gi.

  3. 3

    Paste or type the text you want to search into the large input box below.

  4. 4

    Read the match count and each matched substring with its character index in the results panel; an invalid pattern shows the engine's error message instead.

正規表現とは何か、そしてどう読めばよいか?

正規表現(regex)は、テキスト内のパターンを検索するための小さなドメイン固有言語です。現代のあらゆるプログラミング言語には正規表現エンジンが備わっています。このツールはJavaScriptのネイティブなRegExpを使用しており、ECMAScript 2018以降の仕様に従い、後読みアサーション、名前付きキャプチャグループ、Unicodeプロパティのエスケープ、dotAllフラグといった最新の機能に対応しています。基本的な構成要素は次のとおりです。リテラル文字はそれ自身に一致します(正規表現「gato」は単語gatoに一致します)。文字クラスは集合のいずれかに一致します(「[a-z]」は小文字に一致します)。量指定子は繰り返しを制御します(*は0回以上、+は1回以上、?は0回か1回、{3,5}は3〜5回)。アンカーは位置に一致します(^は文字列の先頭、$は末尾、\bは単語境界)。グループは部分一致をキャプチャします((gato|perro)はいずれかに一致し、どちらだったかをキャプチャします)。選択(オルタネーション)は選択肢を提供します。正規表現は、構造化されているが文法的ではないテキスト(ログ、メール、電話番号、単純なHTML属性)の解析に威力を発揮しますが、本質的に再帰的な構造(完全なHTML、入れ子になったJSON)には対応できません。そうした場合はパーサーを使ってください。このテスターでは、パターンを即座のフィードバックを得ながら反復改善できます。正規表現を変更すると、キーを打つたびに一致箇所が再計算されます。

よくある活用例

  • サーバーに送信する前に、ユーザー入力の形式(メールアドレス、電話番号、郵便番号)を検証する。

  • ログファイルから構造化データ(タイムスタンプ、IP、ステータスコード、リクエストパス)を抽出する。

  • エディタの正規表現検索を使って、数百のファイルにまたがる検索置換を行う。

  • Nginx、Apacheの.htaccess、VercelのリライトのためにURLリライトルールを書く。

  • 本格的なパーサーでは大げさな、単純なCSVのような形式を解析する。

  • HTMLの<input pattern="...">属性のためのフォーム検証パターンを作る。

よくある質問

どのフラグに対応していますか?
g(グローバル:最初の一致だけでなくすべての一致を見つける)、i(大文字小文字を区別しない)、m(複数行:^と$が改行に一致する)、s(dotAll:.が改行に一致する)、u(Unicode:マルチバイト文字を正しく処理する)、y(スティッキー:lastIndexの位置でのみ一致する)に対応しています。フラグは連結して組み合わせます。「gim」はグローバル+大文字小文字を区別しない+複数行を有効にします。
複数行にまたがって一致させるにはどうすればよいですか?
これは2つの異なるニーズです。「m」は^と$を改行に一致させます(アンカーにとって各行を別々の文字列として扱います)。「s」は.を改行に一致させます(そうでない場合、.は改行以外のすべてに一致します)。複数行にまたがるパターンに一致させたい場合は、両方を併用してください。
貪欲な量指定子と怠惰な量指定子の違いは何ですか?
貪欲な量指定子(*、+、{n,m})は可能な限り多くに一致します。怠惰な量指定子(*?、+?、{n,m}?)は可能な限り少なくに一致します。古典的な例として、「<a><b>」に対する正規表現「<.*>」は「<a><b>」全体に一致しますが、「<.*?>」は「<a>」だけに一致します。
正規表現を使うべきでないのはどんなときですか?
構造が本質的に再帰的なとき(HTML、JSON、釣り合いの取れた括弧)です。あらゆる境界ケースを正しく処理する必要があるとき(タイムゾーン付きの日付の解析、アポストロフィを含む名前)もそうです。入力の文法が明確に定義されていて、解析ライブラリが存在するときも同様です。Stack Overflowの有名な回答にあるとおり、正規表現はパターンを見つけるのには優れていますが、言語を解析するのには向いていません。
名前付きキャプチャグループとは何ですか?
(\d{4})-(\d{2})-(\d{2})が番号付きのグループを返すのではなく、(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})を使い、match.groups.yearのように一致箇所にアクセスします。実際のコードでは、はるかに保守しやすくなります。
なぜ私の正規表現は特定の入力で遅くなるのですか?
破滅的なバックトラッキングです。(a+)+のような入れ子になった量指定子は、敵対的な入力に対して指数時間がかかることがあります。入れ子になった量指定子や、重なり合う選択を避けてください。JavaScriptのエンジンにはタイムアウトがないため、不適切な正規表現はリクエストをハングさせる可能性があります。本番環境では、危険なパターンを検出するためにnpmパッケージのsafe-regexを使ってください。
これはサーバー側の正規表現エンジンの動作と一致しますか?
おおむね一致します。主要な正規表現の方言(PCRE、Pythonのre、Rubyの正規表現、Java)は似ていますが、微妙な違いがあります。後読みの構文、文字クラスの挙動、Unicodeの処理は異なります。本番環境との同等性を保つには、対象の言語でもテストしてください。

関連ツール