置き換えはマッチングよりも危険です

間違った検索を行うと結果が見つからない可能性があります。間違った置換を行うと、一致するすべてのレコードが書き換えられる可能性があります。実際のデータに触れる前に、何が一致する必要があるか、何をキャプチャする必要があるか、どの出力が必要か、どの例を変更してはいけないかを定義します。

置き換えに必要なものだけをキャプチャする

グループの選択
FeatureUseRisk
(...)値を取得するグループを挿入すると番号付けが変更される
(?:...)キャプチャなしのグループ代替品としては使用できません
(?<name>...)名前付きキャプチャサポートされているエンジンが必要です
パターンの 以前にキャプチャされたテキストと一致する置換構文が混乱している
$1 の交換品キャプチャしたテキストを挿入する代替品 API に依存

パターンと置換後方参照が異なります

JavaScript 正規表現内では、 は、前にキャプチャされたテキストと一致します。置換文字列に、$1 または $ はキャプチャされたテキストを挿入します。したがって、「最後、最初」の順序を変更するには、パターン内のフィールドをキャプチャし、置換時に逆の順序でそれらを参照する必要があります。

コンテキストのルックアラウンドを使用する

先読みと後読みは、周囲のテキストを消費せずにアサートします。ユニットの前にのみ数値を照合したり、保護されたプレフィックスを除外したり、境界に挿入したりできます。スクリプトが古いエンジンで実行される場合のブラウザ/ランタイムのサポートをテストします。

フラグはスコープを変更します

  • g はすべての一致を置き換えます。
  • i は大文字と小文字の区別を変更します。
  • m は行アンカーを変更します。
  • s を使用すると、行終端文字にドットが一致します。
  • u は Unicode 対応の解析を有効にします。
  • y はスティッキー マッチングを実行します。

g を使用せずに始動すると、安全ブレーキとして役立ちます。

テストマトリックスの作成

Positive通常の試合

予期される入力と出力。

Negative保護されたテキスト

変更してはいけない同様の入力。

Boundaryエッジと句読点

開始/終了と区切り文字。

Unicode名称と記号

アクセント、スクリプト、絵文字。

Malformed不完全な入力

区切り文字と余分なフィールドがありません。

Scale最悪の場合

バックトラックのための長い失敗例。

Jivaro の正規表現テスターを使用する

  1. Regex テスターと置換ツール を開きます。
  2. 代表的なサンプルテキストを使用してください。
  3. 式とフラグを段階的に構築します。
  4. すべての試合とグループを検査します。
  5. 置換を追加し、完全なプレビューを確認します。
  6. 必須一致テストと必須不一致テストを作成します。
  7. 仮定を含めてパターンをエクスポートします。
  8. コピーに対して実行し、差分を確認します。

よくある罠

代替タスク
TaskTrap
フィールドを並べ替える引用符で囲まれたデータ内の区切り文字
空白を正規化するインデントや改行の削除
識別子の名前を変更する長い名前内の部分文字列を変更する
日付を変換する正規表現では、すべての暦日が有効であることを証明することはできません
HTML/URL に一致複雑な文法にはパーサーが必要です

パフォーマンスと展開

壊滅的なバックトラッキングを引き起こす、ネストされたあいまいな量指定子を避けてください。制約付きクラスを使用し、一致しない長い入力をテストします。デプロイメントの前に、バックアップを保持し、エンジンとフラグを記録し、一致をカウントし、差分を確認し、実際のパーサーまたはテストで変換されたデータを検証します。

条件ロジックに置換関数を使用する

静的置換文字列は、出力がキャプチャの固定配置である場合に適しています。出力が数値変換、大文字と小文字の規則、検証、またはオプションのグループに依存する場合、通常は置換コールバックの方が明確です。コールバックは完全な一致、キャプチャ、オフセット、およびソース文字列を受け取るため、読み取り不可能な置換式の代わりに明示的なコードとテストが可能になります。

複雑なビジネス ロジックを正規表現自体に含めないでください。この式を使用して制約された構造を見つけて解析し、通常のコードで決定を処理します。

パターンを小さなプログラムとして文書化する

目的、エンジン、フラグ、サンプル入力、予想される出力、否定的なケース、既知の制限を正規表現の横に保存します。コンテキストのないパターンはレビューが難しく、再利用するのは危険です。本番環境の変換の場合は、変更を監査できるように、一致数と入力/出力のチェックサムまたはバージョンを含めます。

よくある質問

\1 と $1 の違いは何ですか?

\1 はパターン内の後方参照です。 $1 は、JavaScript 置換文字列にキャプチャを挿入します。

非キャプチャグループを使用する場合?

(?:...) は、後で値が必要ない場合に、代替または数量指定子で必要なグループ化に使用します。

交換しすぎを避けるにはどうすればよいですか?

境界、否定テスト、一致数、最初の一致テスト、およびレビュー可能な差分を使用します。

パーサーはいつ使用する必要がありますか?

任意の HTML、JSON、プログラミング言語、複雑な CSV などのネストされたデータまたは文法ベースのデータの場合。

関連するJivaroアプリ

開発者ツール正規表現テスターと置換ツール

分離されたWorkerでJavaScript正規表現をテストし、キャプチャグループの確認、置換プレビュー、テストケース実行、各言語向けコード断片のコピーをローカルで行えます。

アプリを開く

出典と参考文献