置き換えはマッチングよりも危険です
間違った検索を行うと結果が見つからない可能性があります。間違った置換を行うと、一致するすべてのレコードが書き換えられる可能性があります。実際のデータに触れる前に、何が一致する必要があるか、何をキャプチャする必要があるか、どの出力が必要か、どの例を変更してはいけないかを定義します。
置き換えに必要なものだけをキャプチャする
| Feature | Use | Risk |
|---|---|---|
(...) | 値を取得する | グループを挿入すると番号付けが変更される |
(?:...) | キャプチャなしのグループ | 代替品としては使用できません |
(?<name>...) | 名前付きキャプチャ | サポートされているエンジンが必要です |
パターンの | 以前にキャプチャされたテキストと一致する | 置換構文が混乱している |
$1 の交換品 | キャプチャしたテキストを挿入する | 代替品 API に依存 |
パターンと置換後方参照が異なります
JavaScript 正規表現内では、 は、前にキャプチャされたテキストと一致します。置換文字列に、$1 または $ はキャプチャされたテキストを挿入します。したがって、「最後、最初」の順序を変更するには、パターン内のフィールドをキャプチャし、置換時に逆の順序でそれらを参照する必要があります。
コンテキストのルックアラウンドを使用する
先読みと後読みは、周囲のテキストを消費せずにアサートします。ユニットの前にのみ数値を照合したり、保護されたプレフィックスを除外したり、境界に挿入したりできます。スクリプトが古いエンジンで実行される場合のブラウザ/ランタイムのサポートをテストします。
フラグはスコープを変更します
gはすべての一致を置き換えます。iは大文字と小文字の区別を変更します。mは行アンカーを変更します。sを使用すると、行終端文字にドットが一致します。uは Unicode 対応の解析を有効にします。yはスティッキー マッチングを実行します。
g を使用せずに始動すると、安全ブレーキとして役立ちます。
テストマトリックスの作成
予期される入力と出力。
変更してはいけない同様の入力。
開始/終了と区切り文字。
アクセント、スクリプト、絵文字。
区切り文字と余分なフィールドがありません。
バックトラックのための長い失敗例。
Jivaro の正規表現テスターを使用する
- Regex テスターと置換ツール を開きます。
- 代表的なサンプルテキストを使用してください。
- 式とフラグを段階的に構築します。
- すべての試合とグループを検査します。
- 置換を追加し、完全なプレビューを確認します。
- 必須一致テストと必須不一致テストを作成します。
- 仮定を含めてパターンをエクスポートします。
- コピーに対して実行し、差分を確認します。
よくある罠
| Task | Trap |
|---|---|
| フィールドを並べ替える | 引用符で囲まれたデータ内の区切り文字 |
| 空白を正規化する | インデントや改行の削除 |
| 識別子の名前を変更する | 長い名前内の部分文字列を変更する |
| 日付を変換する | 正規表現では、すべての暦日が有効であることを証明することはできません |
| HTML/URL に一致 | 複雑な文法にはパーサーが必要です |
パフォーマンスと展開
壊滅的なバックトラッキングを引き起こす、ネストされたあいまいな量指定子を避けてください。制約付きクラスを使用し、一致しない長い入力をテストします。デプロイメントの前に、バックアップを保持し、エンジンとフラグを記録し、一致をカウントし、差分を確認し、実際のパーサーまたはテストで変換されたデータを検証します。
条件ロジックに置換関数を使用する
静的置換文字列は、出力がキャプチャの固定配置である場合に適しています。出力が数値変換、大文字と小文字の規則、検証、またはオプションのグループに依存する場合、通常は置換コールバックの方が明確です。コールバックは完全な一致、キャプチャ、オフセット、およびソース文字列を受け取るため、読み取り不可能な置換式の代わりに明示的なコードとテストが可能になります。
複雑なビジネス ロジックを正規表現自体に含めないでください。この式を使用して制約された構造を見つけて解析し、通常のコードで決定を処理します。
パターンを小さなプログラムとして文書化する
目的、エンジン、フラグ、サンプル入力、予想される出力、否定的なケース、既知の制限を正規表現の横に保存します。コンテキストのないパターンはレビューが難しく、再利用するのは危険です。本番環境の変換の場合は、変更を監査できるように、一致数と入力/出力のチェックサムまたはバージョンを含めます。
よくある質問
\1 はパターン内の後方参照です。 $1 は、JavaScript 置換文字列にキャプチャを挿入します。
(?:...) は、後で値が必要ない場合に、代替または数量指定子で必要なグループ化に使用します。
境界、否定テスト、一致数、最初の一致テスト、およびレビュー可能な差分を使用します。
任意の HTML、JSON、プログラミング言語、複雑な CSV などのネストされたデータまたは文法ベースのデータの場合。
関連するJivaroアプリ
分離されたWorkerでJavaScript正規表現をテストし、キャプチャグループの確認、置換プレビュー、テストケース実行、各言語向けコード断片のコピーをローカルで行えます。
アプリを開く出典と参考文献
- 正規表現XXQPH0002QXZMDN Web ドキュメント · リファレンス
- グループと後方参照MDN Web ドキュメント · リファレンス
- キャプチャ グループZZQPH0002QXZMDN Web ドキュメント · リファレンス
- 後読みアサーションMDN Web ドキュメント · リファレンス
- Regex テスターおよび置換ツールXXQPH0002QXZJivaro · ファーストパーティ

