「正規表現をテストする」とは何を意味しますか?
正規表現をテストする (「正規表現 テスト」「正規表現 オンライン」「regex test」など)とは、実際のテキストに対してパターンを実行し、エンジンがまさに何を返すのかを観察することです:一致した文字列、その位置、そしてキャプチャグループの値。「正しそうに見える」パターンは、あなたのデータ上で動くまで何も証明しません——チュートリアル上の正規表現と本番の正規表現を分けるのは、その一点だけです。
テストは 3 つの別の問いに答えます。 一致するか :一致テーブルがその場で答えます。 どこで、何件 :インデックスと長さが、アンカーの位置が正しいかを示します。 何をキャプチャするか :番号付きまたは名前付きグループが、取り出したい部分を取り出せているかを明らかにします。
違いを生むメタ文字
ドット . は任意の 1 文字(改行を除く)に一致します——だからフラグ s が必要になるのはテキストが複数行の場合です。量子化子 *, + と ? は 貪欲(グリーディ) で、十分な繰り返し回数の最初で止まります。接尾辞 ? (*?, +?, {2,5}?) はこの挙動を逆転させ、 非グリーディ版 を与えます—— .* が行末を飲み込むときは、ほぼ必ずこちらを選ぶべきです。
角括弧はクラスを定義します: [abc] はリストの中から 1 文字を受け入れ、 [^abc] はそれ以外すべて、 [a-z0-9] は範囲です。クラスの先頭での否定には注意—— [^...] は先頭位置でのみ有効で、そうでなければ ^ はリテラルに戻ります。パイプ | は選択肢を分け、優先度の低い演算子として振る舞います: ^cat|dog$ は「テキスト全体が cat」または「テキスト全体が dog」の意味で、「先頭または末尾が cat または dog」ではありません——その場合はグループ化が必要です: ^(?:cat|dog)$.
グループ、先読み、後読み
括弧はキャプチャします。グループ 1 は $1 の置換側、 \1 のパターン側で参照できます。名前付きグループは $<nom> と \k<nom> で参照できます——3 つ以上のグループでは、はるかに読みやすくなります。 (?:...) は番号を付けずにまとめます。構造を取りたいだけなら、こちらを選ぶべきです。
アサーション(lookaround)は消費せずに検証します: (?=...) 後続の一致を要求し、 (?!...) それを禁止し、 (?<=...) と (?<!...) 前続も同様に検証します。これで、キャプチャには含めずにパスワードへ特殊文字を強制できます: ^(?=.*\d)(?=.*[A-Z]).{12,}$.
ReDoS:正規表現が時限爆弾になるとき
いわゆる ReDoS (Regular Expression Denial of Service) は backtracking に起因します:ほぼ適合する入力に対して、次のようなパターン (a+)+$ は「a」を切り分けるあらゆる方法を試した末に失敗し、試行回数は指数関数的に増えます。2 つの習慣:現実的な量でパターンをテストすること——「パフォーマンス」タブが代行します——、そしてサイズ制限のない外部由来の入力に、監査不能な正規表現を実行させないことです。サーバー上では、詰まった正規表現はタイムアウトまで worker 全体をフリーズさせます。
JavaScript、PCRE、Python:同じ基礎、いくつかの差異
テスターはブラウザのネイティブエンジン、すなわち ECMAScript を使います。基本構文——クラス、量子化子、グループ、先読み、フラグ g i m s u y ——は PCRE(PHP、Perl)、Python の re、Java、Go でも共通です。差異は主に後読み(JavaScript には長く存在しませんでしたが、現在は対応済み)、Unicode プロパティ、そして (?i) のような行内フラグ(PCRE 固有)にあります。したがって、パターンをある言語から別の言語へ移すのは細部の調整であって、発明ではありません。
こんな方に推奨
フロントエンド/バックエンド開発者(フォーム検証、ログ解析、データ移行)、Ops・DevOps(設定フィルタ、WAF ルール)、テスター・アナリスト(列の抽出、フォーマット検証)、編集者・データアナリスト(ファイルのクリーニング)、学生(メタ文字の理解)、そして 正規表現テスター を速く・包括的に・機密性高く使いたいすべての方へ。補完ツールとして JSON フォーマッター、URL エンコーダー/デコーダー、Base64 エンコーダー/デコーダー と JWT エンコーダー/デコーダー.