最も時間を費やした正則は、私が書かなかった正則でした。 4歳、検証レイヤーに座っていて、猫がキーボードを横切って歩いたように見えました:ネストされたグループ、先読み、2つの文字クラス、およびa {2,} 最後に隠れています サポートチケットには有効な入力を拒否している と書かれていました 修正する前に理解しなければなりませんでした つまり 頭の中でパターン上でエンジンを回すということです 一度に1 つのトークンが付いているのは すべての開発者が 馴染みのない正則に対して支払う税金です まさにその税金です 正規表現説明者 on Toolz.dev は削除するように構築されています。このガイドは、正規表現をデコードするのではなく読むこと、およびトークンごとの内訳によってシンボルの壁が通常のコードのように確認できるものになる方法について書かれています。
tl;dr: 正規表現を解析する正規表現は、エンジンが読み取る順序で、各部分を平易な英語で記述します: アンカー、文字クラス、量指定子、グループ、ルックアラウンド、エスケープ、すべてラベル付けされインデントされているため、入れ子構造が表示されます 正規表現説明者 実際の JavaScript エンジンでパターンを検証し、何もアップロードせずにブラウザで全体の内訳を実行します。
正規表現の説明者とは何ですか?
正規表現を取り出し それを一度に1 つの構文で 読み取れる記述に変換します 正規表現を じっと見つめるのではなく ^(?<user>[a-z0-9._%+-]+)@ そして頭の中でその意味を再構築すると、順序付きリストが得られます。これは文字列の開始アンカー、これはユーザーと呼ばれる名前付きキャプチャ グループ、これは小文字、数字、ドット、パーセント記号に一致する文字クラスです。プラスまたはハイフン、この量指定子は 1 回以上意味します。パターンは変わっていませんが、それを理解する努力は頭からツールに移りました。
この値は正規表現が意図的にコンパクトであるという事実から来ています. すべての記号は意味を持ち, 同じ意図が多くの異なる方法で記述できるので, 関数をスキミングするようにパターンをスキミングする信頼できる方法はありません. 1 つの迷走バックスラッシュは文字通りの点を " any 文字, " に変更します.怠惰なものを望む貪欲な量指定子はグループがキャプチャするテキストを変更します. regex を正しく読むことはエンジンをシミュレートすることを意味し, エンジンを手動でシミュレートすることは時間がかかり, エラーが発生しやすいです.説明者はそのシミュレーションを行って結果を示します.
Toolz.dev ではフローが短いです。 pattern を周囲のスラッシュなしで貼り付け、使用するフラグを切り替えると、内訳がすぐに表示されます。ネストされたグループはインデントされているため、パターンの形状が一目でわかります。各フラグはコンテキストで説明されているため、構文だけでなく一致全体がどのように変更されるかを理解できます。
説明者は正規表現テスターとどう違うのですか?
これら2 つのツールは異なる質問に答え、どれが必要かを知ると時間を節約できます。 regexテスターはサンプルテキストに対してパターンを実行し、それが一致するものを示します:強調表示された一致、キャプチャグループ、および任意のエラーに答えます " このパターンは私がこの入力でやりたいことをします. " 説明者は、テスト入力をまったく行わずにパターンが何を意味するかを説明します. " このパターンが実際に言っていることは何ですか. "
正則がデータではなく未知である場合、説明者に手を伸ばします。 validation パターンを追加するプルリクエストを確認したり、文書化されていない表現でいっぱいのコードベースを継承したり、フォーラムからコピーした回答を理解しようとすることは、すべてパターンがあり、それを信頼する前にそのパターンが何をするのかを知る必要がある場合に手を伸ばします 正規表現テスター パターンをすでに理解していて、実際の例に対してその動作を確認したい場合 実際には、2 つはペアとして機能します。パターンを説明して理解してから、テストして証明します。テスターと説明者は、まさにその理由から、Toolz.dev で隣り合って座ります。
家族の3 つ目のツールがあります 名前を付ける価値があります。 the 正規表現ビルダー ゼロから始めるときにコンポーネントとテンプレートからパターンを組み立てます。 「構築」、「説明」、「テスト」: これら 3 つは、まだ書いていない正規表現の記述から書いていない正規表現の理解まで、正規表現を操作するライフサイクル全体をカバーします。
実際の内訳はどのようなものか?
説明者はパターンを左から右に歩き、エンジンがそれらに遭遇した順序で、構造ごとに 1 つのラベル付き行を放射します。正規表現が順番に読み取られ、トークンが順番に表示されることは、実際にマッチングがどのように進行するかを反映するため、その順序付けが重要です。
ほとんどのパターンでアンカーが先になります。 the ^ あんど $ シンボルは文字と一致しません; 彼らは位置、文字列の開始と終了、または複数行のフラグが設定されているときの各行の開始と終了を主張します 説明者はこの二重の動作に注意するので、その下で異なる動作をするアンカーに驚かれることはありません m 旗.
角括弧で書かれた文字クラスは、集合から描かれた単一の文字を記述します。 explainer は集合を単語に展開します: のような範囲 a-z "a から z までの範囲になり、" になります。のような省略記号のエスケープ \d " a digit, " になり、先頭のキャレットは " not" である任意の文字になります リストされたセットのような密なクラス [a-zA-Z0-9._%+-] パズルではなく、単純なリストとして読めます。
数量指定子は微妙なバグが住んでいる場所であるため、独自の行を取得します。 A * はゼロ以上、 + は一つ以上、 ? はゼロか1、そして {n,m} は明示的な範囲である。 重要なのは、説明者が遅延量指定子、つまり末尾で書かれたものにフラグを付けることである ? など +? や *?なぜなら、貪欲な文字と怠惰な文字の違いは、他の場所で目に見える文字を 1 つも変更せずにパターンにテキストメッセージを送信することで変化するからです。
グループとルックアラウンドはネストを表示するためにインデントされます。キャプチャ グループ、非キャプチャ グループ、名前付きグループ、および 4 つのルックアラウンド タイプすべてがそれぞれ、その動作の説明を取得し、その中の子パターンが 1 レベルインデントされるため、構造はフラットではなくネストされたアウトラインのように読み取られます。シンボルの実行。
一般的な構成が説明者があなたに言うことにどのようにマッピングされるかは次のとおりです:
| 構築します | 例 | 説明者の言うこと |
|---|---|---|
| アンカー | ^ |
文字列の開始 (または m フラグを持つ行の開始) |
| キャラクタークラス | [a-z] |
aからzまでの範囲の1 文字 |
| 速記 | \d |
0 から 9 までの数字 |
| 量指定子 | {2,} |
2 回以上繰り返す |
| 遅延量指定子 | +? |
できるだけ少なく、1 回以上繰り返します |
| グループを捕まえている | (...) |
再利用のために保存されたキャプチャ グループの開始 |
| 名前付きグループ | (?<id>...) |
名前付きキャプチャグループの開始 "id" |
| 先を見据えて | (?=...) |
囲まれたパターンは従う必要がありますが、消費されません |
| バックリファレンス | \1 |
キャプチャされた同じテキストグループ1 に一致します |
説明は、で使用されている用語に従っています MDN 正規表現 リファレンス、したがって、任意の単一の構造でさらに読みたい場合は、内訳の単語は、検索する単語です。
なぜ風味が重要なのでしょうか?
正規表現は一つの言語ではない; それらは密接に関連したもののファミリーである。 JavaScript, PCRE (PHPや多くのツールで利用されている), Python' s re module、java、.net はすべてコア構文を共有していますが、エッジで分岐しており、それらのエッジは混乱が生じる場所です。 Regex Explainer は、ブラウザと Node.js で使用されるフレーバーである JavaScript 正規表現について説明します。なぜなら、それがツールが検証するものであり、ほとんどの Web 開発者が実際に実行するものだからです。
共有コアは大きくて信頼できます。 character classes, the common quantifiers, alternation with |、グループ化、アンカー、およびのような標準的な速記 \d あんど \w どこでも同じことを意味します。パターンがそれらだけを使用している場合、最終的に実行する言語に関係なく、説明は正確です。相違点は高度な機能にあります。サポートの後ろが JavaScript で遅れて到着し、PCRE とは異なります。名前付きグループ構文はフレーバーによって異なり、一部のエンジンは JavaScript にはない再帰または所有数量詞をサポートしています。
実用的なルールは単純です。 共有コンストラクトの説明を権威あるものとして扱い、フレーバー固有の拡張機能をターゲット言語のドキュメントと照合して再確認します。説明者は最初に実際の JavaScript エンジンでパターンを検証するため、JavaScript がサポートしていないコンストラクトは間違った説明ではなくエラーとして表面化し、より安全な失敗になります。私が行っているようにスタック全体で作業している場合、PHP バックエンドと JavaScript フロントエンドの間を移動し、フレーバーについて明示的になると、ある場所で機能していたパターンが別の場所で静かに不正動作するというバグ クラスが保存されます。
それを使って実際のパターンを読むにはどうすればよいですか?
ツールがロードするサンプルをデフォルトで取り、電子メールの形のパターンを取ります: ^(?<user>[a-z0-9._%+-]+)@(?<domain>[a-z0-9.-]+\.[a-z]{2,})$ 大文字と小文字を区別しないフラグを使用します。それ自体では一口です。説明者を通して実行すると、読みやすい短い概要に分解されます。
ザ・ ^ 文字列の先頭をアサートします 最初に名前付きグループである user は、小文字のクラス、数字、アドレスのローカル部分で一般的に許可されている句読点から 1 つ以上の文字をキャプチャし、次にリテラル @.2 つ目の名前付きグループ、ドメインは、1 つ以上の文字、数字、ドット、またはハイフンをキャプチャし、その後にリテラル ドットと 2 つ以上の文字の実行が続き、これがトップレベル ドメインです $ 文字列の終わりをアサートします。 the i flag は、大文字と小文字に関係なく全体が一致することを意味するため、小文字のみのクラスは引き続き大文字の入力を受け入れます。
そう読めば、生のパターンでは見えない二つのものが飛び出す まず、 {2,} トップレベル ドメインでは、パターンが 2 文字以上の任意の TLD を受け入れることを意味します。これは、現代のドメインでは正しいですが、非ラテン文字で書かれた国際化された TLD を拒否することになります。第 2 に、アンカーはパターンが文字列全体と一致する必要があることを意味するため、より大きなテキスト内で 1 つを見つけるのではなく、アドレス全体を検証します。これらはまさに、検証正規表現が厳しすぎるか緩すぎるかを決定する種類の詳細であり、原文では見逃しやすいものの、内訳では明らかです。
パターンを理解したら、それを使って何かをしたいと思うことがよくあります。 find-and-replace パターンであれば、 Regex 置き換える ツールは backreference サポート付きで置換を実行します。 extraction パターンであれば、 Email Extractor まさにこの種の電子メール マッチングの厳選されたバージョンを一括テキストに適用します。説明者は読み取りステップです。これらは実行ステップです。
これを実際に使うのはいつでしょうか?
コードレビューは私が最もヒットしたケースです。チームメイトが検証レイヤーまたはログパーサーに正規表現を追加し、差分にはコメントのない記号の行が表示されます。説明者に貼り付けると、5分間の視線が 10 秒間の読み取りに変わり、古典的なレビューのミスがキャッチされます。任意の文字に一致するエスケープされていないドット、キャプチャしすぎる貪欲な数量詞、逆であるべきときに存在または存在しないアンカー。コメントとしてプルリクエストに内訳を貼り付け始めました。これは、次の人のパターンを無料で文書化します。
学習が次です 正規表現は 毎日使わないと 決して完全に定着しないスキルの1つです 数ヶ月後にまた正規表現にたどり着くということは 常に構文を再学習することを意味します 説明者と一緒に実際のパターンを読むことは チュートリアルを読み直すよりも 早く戻る方法です なぜなら 孤立した例ではなく コンテキストで構文を見たり 実際の作業を行ったりしているからです 時間が経つにつれて 説明は不要になるのです それはポイントです。
デバッグはループを閉じます パターンが間違ったものに一致すると 説明によってテスト入力に手を伸ばす前に その理由が明らかになることがよくあります 怠け者であるべき時に貪欲な量化子 忘れた文字を含む文字クラス パターンが部分文字列と一致させる 欠落しているアンカー これら全てを内訳の横に説明者を置きます 正規表現テスター したがって、同じ座り方で説明してテストすることができ、両方とも、私が説明した幅広のキットに住んでいます Web 開発者ツールキット ガイド。
プライベートですか、オフラインでも動作しますか?
両方に「はい」です 同じ理由で 内訳全体がブラウザ内のJavaScriptで計算されます パターンはサーバーに送信されず 何も記録されず ページが読み込まれたら ツールは接続を無効にしたまま動作し続けます ネットワークタブを開くか オフラインにして 機能が続くのを見れば 確認できます。
これは、正規表現に特有の場合よりも重要です パターンは、機密性の高い形式 (内部識別子、APIキーの形状、アカウント番号のレイアウト、またはプライベートデータの構造) に一致するように記述されることがよくあります それらの1 つをサーバー側のツールに貼り付けることは、データ形式の説明を第三者に渡すことを意味します 分析クライアント側を維持することは、パターンがマシンに留まることを意味し、これは、Toolz.dev上のすべてのツールの背後にある同じプライバシー第一の原則であり、1 つのツールでより完全に書きました データ プライバシー ガイド。
フェイク
複雑な正規表現を理解するにはどうすればよいですか?
パターンを説明者に貼り付け トークンごとの内訳を読みます これはエンジンが適用する順序で 各構成を平易な英語で記述しています ネストされたグループはインデントされています 構造が見えるようにすることで エンジンを頭の中でシミュレーションする作業を ラベル付きリストの読み取りだけに変えます これはより速く 誤差がはるかに少ないものです。
正規表現の説明者と正規表現のテスターの違いは何ですか?
正規表現の説明者は、テスト入力なしでパターンの意味を説明し、正規表現のテスターはサンプル テキストに対してパターンを実行し、一致するものを示します。説明者を使用して、見知らぬパターンを理解または文書化し、実際のデータに対して期待どおりに動作することを確認します。彼らはさまざまな質問に答え、ペアとしてうまく機能します。
説明者はどのような正規表現のフレーバーを説明していますか?
ブラウザやNode.jsで使われるフレーバーであるJavaScript (ECMAScript) 正規表現について記述しています 文字クラス、量指定子、グループ、アンカーを含むほとんどの構文はPCRE、Python、Javaと共有されているため、コアとなる説明は言語間で正確です。 lookbehindやnamed-group構文などのフレーバー固有の機能は異なる可能性があるため、ターゲット言語に対してそれらを確認してください。
貪欲な量指定子と怠惰な量指定子の違いは何ですか?
+ や * などの貪欲な量指定子はバックトラックする前にできるだけ多くのテキストと一致しますが、遅延量指定子、つまり同じ記号の後に ? +? や *? が続くものは、できるだけ一致しません。説明者は、遅延量指定子に明示的にラベルを付けます。これは、パターンがキャプチャするテキストが他の場所で見える文字を変更しない違いによって変化するためです。
説明者は先を見据えて後ろを向いて処理できますか?
はい。 (?=...) と (?!...) と書かれた正と負の先読み、(?<=...) と (?<!...) と書かれた正と負の先読みは、それぞれが主張するものでラベル付けされ、他のグループと同様にインデントされます。 Lookarounds は、テキストがマッチに含めることなく位置に表示されるか表示されないかをチェックします。説明ではこれが明示されています。
なぜ説明者が私のパターンが無効であると言うのですか?
パターンは、それが説明される前に、実際のRegExpエンジンでコンパイルされているので、アンバランスブラケットや括弧、無効なエスケープ、または未知のフラグは、engine& #39; s正確なエラーメッセージで報告される問題を修正しますほとんどの場合、欠落している閉じる括弧やブラケット、と内訳が表示されます。
プライベート データに一致する正規表現を貼り付けても安全ですか?
はい。パターンはブラウザ内の JavaScript で完全に分析されます。パターンはサーバーに送信されず、ログに記録されることもなく、ページが読み込まれるとツールは接続を無効にして動作します。プライベート コードベースや、個人または独自の形式に一致するコードベースのパターンを安全に説明できます。
これはregexビルダーとどう違うのですか?
regex ビルダーは、ゼロから開始するときにコンポーネントとテンプレートから新しいパターンを構築するのに役立ちますが、説明者はすでに持っているパターンを説明します。この 2 つは補完的です。Regex ビルダーでパターンを構築し、説明者で既存のパターンを理解し、Regex テスターで実際の入力に対していずれかを確認します。
無料の独自のパターンをお読みください 正規表現説明者。正規表現の down トークンを、何もアップロードせずにブラウザー内で完全に平易な英語でトークンごとに破ります。



