私は午後の大半を一度、単一の貪欲な量指定子で失いました。 wordpress移行のためのリダイレクトマップを書いていました - 新しいスラグに書き換える必要があった数百の古いURL - そして私は正則を持っていました 想定されている 各パスから後続のスラッグをキャプチャします。 頭の中でテストした 3 つの URL で機能しました。 2 つのパス セグメントを持つ 4 番目では機能しませんでした。 .* 最初のスラッシュとその後のすべてを、元気に飲み込んでいました。 このルールは、サイトの半分を間違った場所に黙ってリダイレクトしました。私のテストではなく、読者から見つけました。これは、私の「テスト」がパターンを見て信頼していたためです。
これが正規表現の核心的な問題です。何かに対して実行するまでは、書き込み専用です。 パターンは、実際の入力が間違っていることが証明された瞬間までもっともらしいと読み、故障モードは静かです。 何にも一致しない正規表現は、エラーをスローしません。 あまり一致しない正規表現は、エラーをスローしません。 微妙に間違ったキャプチャ グループを持つ正規表現は、間違った部分文字列を渡して先に進みます。 パターンを知る唯一の方法は、実際に見て、実際に見て、面倒でエッジのような大文字のテキストをそれに与えることです。 みて それがつかむもので。
あ 正規表現テスター そのギャップを閉じます. あるボックスにパターンを入れ, 別のボックスにサンプルテキストを入れると, すべてのマッチが所定の位置に点灯します - キャプチャグループがブレイクアウトしたので, グループ1 とグループ2 に着地した文字列のどのスライスを正確に確認できます. Toolz.dev用に構築したものは, browser' sネイティブで動作します RegExp エンジン、JavaScript と TypeScript コードが使用するものと同じです。つまり、テスタに表示されるものは、本番環境で得られるものです。 近似も、「十分に近い」もありません。
このガイドでは、テスタを使用してパターンをすばやくデバッグする方法、各フラグが実際に行うこと、グループと名前付きグループを出力に表示する方法、および Python または PCRE からの人をトリップする JavaScript 固有の Gotchas について説明します。
tl;dr: パターンを Toolz.dev 正規表現テスタ (スラッシュは必要ありません)、G/I/M/S/U/Y フラグを切り替えて、テスト テキストを下にドロップします。 マッチはライブ ハイライト ライブ ハイライト カラーを使用して、すべての番号と名前付きキャプチャ グループがマッチごとにリストされ、シンタックス エラーはエンジンの正確なメッセージを示します。 本物の JavaScript 正規表現エンジンを使用し、100% クライアント側で実行されるため、ログはアップロードされず、 正規表現ビルダー パターンを最初から組み立てる場合。
プログラム全体を実行せずに正規表現をどのようにテストしますか?
正規表現をデバッグする遅い方法は、私たちのほとんどが始まるループです: コード内のパターンを編集し、プログラムを実行し、出力を読み、何が問題だったかを推測し、繰り返します すべての反復にはプログラム全体の実行に費用がかかり、フィードバックは間接的です - あなたはを参照してください 結果 試合自体ではなく、試合の。
テスターは、そのループを何もしません。 パターンを貼り付け、代表的なテキストを貼り付け、すぐに一致を確認します。 パターンで 1 文字を変更すると、ハイライトが更新されます。 これにより、フィードバックができる限り引き締められます 探検するー試してみる + あなたが持っていた場所 *、単語の境界を追加し、グループを非キャプチャ - とエフェクトを想像する代わりにリアルタイムで着陸するのを見ます。
重要な分野は、 本物 あなたの頭の中のきれいな例ではなく、テストテキスト 私のリダイレクトマップを壊したURLは2 つのパスセグメントを持っていました; 私の心のテストケースは1 つを持っていました 古いURLの実際のリストをテスターに貼り付けていたら、貪欲な一致は4 行目で目に見えて間違っていたでしょう 実際のログ行、実際のユーザー入力、実際のファイルパス - 醜いものを含む - をつかみ、テスターがあなたのユーザーの前にパターンが崩壊する場所を示しましょう。
正規表現フラグは実際に何を変更しますか?
フラグは、パターン全体の適用方法を変更します。それらを誤解することは、「なぜこれが機能しないのか」という大きなシェアの背後にあります。 ザ・ テスター 6 つの JavaScript フラグすべてをトグルとして公開して、1 つを反転して結果の変化を確認できるようにします。
g - グローバル. それがないと、マッチングは最初のヒットで止まります。 それを使って、エンジンはテキスト内のすべての一致を見つけます。 テスタでは、ほとんどの場合、すべての一致を表示する必要があるため、グローバルはデフォルトでオンになっています。これをオフにすると、シングルマッチのコールがどのようなものかを確認するためにオフにします。 String.match なしで g 戻ってきます。
i - 大文字と小文字を無視します. パターン全体が大文字小文字を区別しないようにするため、 error マッチ Error あんど ERROR。 簡単で、g の後に最もよく使用されるフラグ。
m - マルチライン. これは広く誤解されています。 それはそうだ でないよ 作る . クロスラインブレイク。 それは何を変えるか ^ あんど $ アンカー : で m、それぞれの最初と最後に一致します ライン、文字列全体の開始と終了だけではありません。 ログで行ごとに一致している場合は、これが必要です。
s - dotAll. これがフラグです . 改行文字を一致させます。 それがなければ、 . 任意の文字に一致 以外 改行が発生するのは、複数の行にまたがるパターンが最初の行で静かに停止することが多い理由です。 試合が境界線を越える場合、 s それはあなたが必要としているものです - そうではありません m。
u - ユニコード。 完全な Unicode モードを有効にします。 \u{...} 仕事をエスケープし、代理ペアを単一のコード ポイントとして扱い、文字クラスを次のようにします。 \p{Letter} 利用可能。 テキストに絵文字または非ラテン語スクリプトがある場合に重要です。
y - 粘着性. アンカーは、それぞれのマッチを正確な位置に合わせて試みます。 lastIndex、つまり、一致が正確に開始された場合にのみ、一致が成功します。 これは、トークナイザーやパーサーで使用されるニッチなフラグであり、ほとんどの日常業務は決して触れません。
最も時間がかかる混乱は、 m 対 s。 人々は、ドトールを意味する場合に複数行に到達します。 ドットが線を越えていない場合は、必要があります s。 アンカーが線の境界に達していない場合は、必要があります m。 さまざまな問題を解決し、よく一緒に使用されます。
キャプチャ グループはどのように出力に表示されますか?
パターンの括弧は 2 つの仕事をします。数量指定子または交互のサブパターンをグループ化し、 捕まえる 抽出のための一致したスライス. you& #39; regex を使用してテキストからデータを引き出すとき - date& #39; s 年月, ログ行& #39; s タイムスタンプとレベル - キャプチャグループは全体のポイントであり、それらを間違えることは " の最も一般的なソースですパターンは一致しますが、私は間違った文字列を得ました. "
ザ・ テスター キャプチャ グループがその下に分割されて、すべての試合をリストします。 グループ 1 は最初の括弧で囲まれたサブパターンで、グループ 2 は 2 番目のパターンで、それぞれが一致するためにキャプチャされた正確なテキストとともに表示されます。 グループ 1 が予想よりも多く取得した場合、グループ 1 のバグが明らかになります。これを見て、括弧を引き込むことができます。
名前付きグループも同じ扱いを受けます。 あなたが書くとき (?<year>\d{4})-(?<month>\d{2})、テスターは名前によって捕獲を示します - <year> あんど <month>- 番号付きの同等のものと一緒に、信頼する前に意図したスライスに名前がマッピングされていることを確認できます match.groups.year コードで。 名前付きグループはパターンの自己文書化とコードの読みやすく、テスタでの解決が最も早く信頼できる方法です。
関連するトラップ テスタがサーフェスを表面に示します。パターンには参加しているが、特定の試行で一致しなかったグループは、空の文字列ではなく「一致しない」と表示されます。 JavaScript では、そのようなグループは undefined、常に文字列がスローされると想定するコード。 テスタでフラグが立てられているのを確認すると、そのアクセスをガードするように指示されます。
これはどの正規表現のフレーバーで、なぜ重要なのですか?
正規表現は 1 つの言語ではありません。 Python で機能するパターン re モジュールは JavaScript で - あるいは throw - といった異なる動作をしたり、逆の動作をしたりできます これは テスター javascript を使用します ()ECMAScript) ブラウザに組み込まれたエンジン。 node.js が実行されるのと同じエンジンです。したがって、javascript、typescript、または Node コードを記述した場合、ここでの結果はまさにコードが行うことになります。
その精度は両方向にカットします。 PCRE 用に書かれたスタック オーバーフローの回答からパターンをコピーすると (PHP、および preg_ wordpress の作業で常に使用する関数) または Python の場合、いくつかの機能は won't 翻訳されます。 JavaScript は歴史的に後ろ向きのアサーションが不足しており、比較的最近になって取得しましたが、依然として一部の Unicode プロパティのエスケープを異なる方法で処理しています。 PCRE don' からの所有量指定子と原子グループは JavaScript にまったく存在します。再帰 - ネストされた構造を照合するための PCRE 機能 - には、同等の JavaScript がありません。
実用的な結果: 展開するフレーバーをテストします。 1 つのエンジンを忠実に実装するテスタは、「テスタで機能した」という意味で、「コードで機能する」という意味であるため、すべてのファジー平均を実装するものよりも便利です。PHP と WordPress の作業では、違いを念頭に置いてサーバー側で別に検証します。JavaScript については、このテスターは、すべての違いを念頭に置いて、サーバー側で検証します。 です 真実の源。 この種の言語認識検証のためのより広範なツールキットは、 コーディング ツール ガイド。
正規表現テスターの日常的な使い方は何ですか?
検証パターンの構築とデバッグ
メールフィールド、電話番号、郵便番号、スラグ、セマンティックバージョン文字列 - すべてのフォームが何かを検証し、検証は通常正規表現です。テスターを使用すると、出力前にパターンに厄介なケースを投げることができます。プラスアドレッシングタグ付きのメール、拡張子付きの電話番号、バージョン文字列など 1.10.0 素朴なパターンが切り詰められること。 実際の値の列を貼り付けて、一致しない値を監視します。
ログからデータを抽出する
サーバーログ、アプリケーションログ、CSVエクスポートは半構造化テキストであり、regexはフィールドをそれらから引き出す方法です Captureグループはタイムスタンプ、レベル、リクエストIDをつかみます。 tester' s 1 マッチごとのグループの内訳は、まさにここに必要なビューです - ダースの実際のログ行を貼り付け、すべてのフィールドが、整然とした最初の行だけでなく、それらのすべてにわたって右グループに着陸することを確認します これは、と合致します API デバッグ ワークフロー 応答本文とヘッダーが特定の値を求めてスクレイピングされる場所。
コードベース全体で検索と置換
エディターと IDE は検索と置換で正規表現をサポートしていますが、そこの悪いパターンは意図したよりもはるかに多く書き換えられる可能性があります。 をテストする マッチ 交換を実行する前に専用のテスターでサイドは、安価な保険です - 代表的なサンプル全体でパターンが何を選択するかを正確に確認してから、自信を持って交換を実行します。私のリダイレクトマップの災害は、基本的に、最初に実際の入力に対してテストしたことのない、発見と交換でした。
正規表現の学習と教育
ライブ ハイライトにより、テスターは本物の学習ツールになります。 一度に 1 つのパターン トークンを作成し、アンカー、数量指定子、およびクラスを追加するときに、マッチ セットが縮小および成長するのを観察します。 見ている \d+ 整数をつかんでから \d 1 桁の取り込みは、散文の説明よりも理解に役立ちます。 既存のパターンをデバッグするのではなく、コンポーネントからパターンを組み立てる準備ができている場合、 正規表現ビルダー は、コンパニオン ツールです。
長さゼロのマッチ トラップをどのように回避しますか?
空文字列にマッチできるパターン - a*、 \d*、 (foo)?ー "match" 文字間のあらゆる位置で、空の一致の洪水を生成することができます。 does' t は、ゼロ長の一致ループを永遠に越えて進む素朴なマッチングコード。 ザ テスター 常に前進することで、これを内部的に防御するため、ハングすることはありませんが、 みせ あなたは空の試合です。
その表示はノイズではなく機能です。 空の一致の山は、あなたの量指定子が許容範囲が広いとテスターが教えてくれます。 「1 つまたは複数の数字」を意味する場合、あなたは書いた \d* あなたが欲しかったとき \d+。 グループが必要な場合は、オプションでマークを付けます。 ?。 空の一致を確認することで、修正を行うことができます。 パターンが正しい場合、一致はあなたが気にする部分文字列であり、それ以外は何もありません。
JavaScript 正規表現とその他のフレーバー: 簡単な比較
| 特集 | JavaScript (このテスター) | PCRE (PHP) | パイソン re |
|---|---|---|---|
| 名前付きグループ | (?<name>...) |
(?<name>...) や (?P<name>...) |
(?P<name>...) |
| 後ろを見て | サポートされている (最新エンジン) | 対応 | 対応 |
| 原子群 / 所有格 | サポートされていません | 対応 | 限られた |
| 再帰 | サポートされていません | 対応 | サポートされていません |
| ドットが改行フラグと一致 | s (ドトール) |
s (ドトール) |
re.DOTALL |
Unicode プロパティ \p{...} |
必要 u 旗 |
必要 u 修飾子 |
regex モジュールのみ |
| スティッキーマッチング | y 旗 |
\G いかり |
\G-経由のように match 位置 |
表の教訓は、「正規表現」は家族であり、標準ではないということです。 構文は、言語間でパターンをコピーするのに十分なほど重複しており、その違いは、困難な問題に対して到達する高度な機能です。 ターゲット フレーバーでテストします。 JavaScript とノードの場合、これはテスターです。 Web 開発者ツールキット 他の言語固有のツールが適合する場所をカバーします。
センシティブ テキストに対して正規表現をテストしても安全ですか?
正規表現をテストするテキストは、多くの場合、機密性の高い種類のものです。IP アドレスとユーザー ID を使用した本番ログ ライン、電子メール アドレスを使用したエクスポート、内部ホスト名の構成ファイルです。 それはまさにあなたのデータです すべきではない サーバーに出荷されるツールに貼り付けます。
ザ・ Toolz.dev 正規表現テスタ 完全にブラウザで実行されます パターンのコンパイル、マッチング、グループの抽出 - そのすべてはクライアント側のJavaScriptであり、ネットワークリクエストはどこにでもパターンやテキストを運ぶことはありません ページがロードされた後、接続を切断し、それが機能し続けます That' s アーキテクチャ保証、プライバシーポリシー文ではなく、そしてit' s セット内のすべてのツールの背後にある同じブラウザファーストの原則でレイアウトされています データ プライバシー ガイド。
つまり、実際のログ行 (パターン & #39;s エッジ ケースを表示する実際の PII を含む行) を貼り付け、安全にデバッグできます。それ & #39;s の要点全体: テスターは実際の入力を提供する場合にのみ役立ちます。実際の入力は、多くの場合、正確に何が可能か & #39;t で他の人に送信したり & #39;s サーバーに送信したりできます。
フェイク
オンラインで正規表現をテストするにはどうすればよいですか?
パターンフィールドに周囲のスラッシュなしでパターンを入力し、フラグを選択し、テスト領域にサンプルテキストを貼り付けます 一致は即座にハイライトされ、キャプチャグループは試合ごとにリストされます すべてがブラウザで実行されます - 何もアップロードされません。
このテスタはどのような正規表現のフレーバーを使用していますか?
ブラウザに組み込まれた JavaScript (ECMAScript) の正規表現エンジンを使用します。これは、Node.js と同じです。 結果は、JavaScript と TypeScript で同じパターンがどのように動作するかに一致します。 JavaScript の正規表現は、アトミック グループや再帰などのいくつかの高度な機能において、PCRE、Python の RE モジュール、および Java パターンとは異なるため、展開するフレーバーでテストしてください。
正規表現のフラグ G、I、M、および S は何を意味しますか?
g (global) フラグは最初に停止するのではなく、全ての一致を見つけます。 i フラグは一致する大文字と小文字を区別しません。 m (multiline) フラグは文字列の start と end だけではなく改行時に^と$アンカーを一致させます。 s (dotAll) フラグはドットも改行文字を一致させます。 mとsフラグはしばしば混同されます - mはアンカーを変更し、sはドットを変更します。
キャプチャ グループはテスターでどのように機能しますか?
パターンの括弧でキャプチャ グループを作成します。 テスタは、各試合でキャプチャされたテキストを含む番号付きグループをリストするため、パターンの各部分がつかんだ文字列のスライスを確認できます。 (?) という名前の名前付きグループ...) 番号付きグループの横に名前が表示されます。
正規表現が何も一致しないのはなぜですか。
何も一致しないパターンには、通常、文字数が多すぎるか、文字通りのドットやプラス記号など、エスケープされていない特殊文字が含まれます。 エラーをスローするパターンには、不均衡な括弧や括弧などの構文に問題があります。 テスタはエンジンの正確なエラー メッセージを表示して、問題をすばやく特定できます。
複数行に合わせてどのように一致させますか?
線の切れ目をスパンするドットが必要な場合は、S (dotall) フラグを有効にし、各行の開始と終了で ^ および $ アンカーを一致させる場合は、m (複数行) フラグを有効にします。 両方を組み合わせると、1 つのパターンがログや CSV 行などの複数行入力に対して自然に機能します。
機密データに対して正規表現をテストしても安全ですか?
はい。すべての照合はブラウザ内の JavaScript で行われます。パターンやテスト テキストがどのサーバーにも送信されず、何もログに記録されず、ツールは接続を無効にして動作します。ログ ファイル、個人データ、または独自の形式に対して安全にテストできます。
正規表現テスタと正規表現ビルダーの違いは何ですか?
正規表現テスタはテキストに対して既存のパターンを実行して、それを検証してデバッグできます。一方、正規表現ビルダーは、コンポーネントまたは一般的なテンプレートからパターンを作成するのに役立ちます。 このサイトの Regex Builder を使用してパターンを組み立て、それをテスタに持って行って、実際のサンプル データと照合します。
正規表現は、実際の入力に対して実行するまで書き込み専用であり、失敗は静かです - 一致するものは何もなく、一致しすぎ、間違ったグループがキャプチャされ、エラーが表示されないように、テスターがパターンを表示するようにします: 正規表現を貼り付けます、それに醜い実在のテキストをフィードし、本番環境で間違ったものをつかむ前に、それが何をつかむかを正確に観察してください。



