テキストおよび日常ツール · テキスト ツールキット
検索と置換ツールが半入力の正規表現に耐えなければならない理由
· なぜそれが重要なのか
検索と置換 正規表現 テキスト編集
パターンの入力は増分であるため、左括弧が 1 つだけあるのが通常の状態です。この投稿では、コンパイルを保護し、テキストをそのままにし、元に戻す機能は正確性を保つための機能であり、洗練されたものではないと主張しています。
アンバランスなブラケットのボックスをクリアしたツール - 1 回のキーストロークで 1 時間のクリーンアップが台無しになる方法
検索と置換ボックスには、その横にある検索パターンよりも組み立てにはるかに時間がかかる作業が含まれることがよくあります。不完全な式がインターフェイスを通過したり、エディターをクリアしたり、その状態が不確実なままになったりする可能性がある場合、このツールは、単純化するはずだったクリーンアップ タスクよりもパターンの入力をより危険なものにしてしまいます。
このリポジトリには、ToolAcre が 1 時間の作業を消去したという具体的な事件が記録されていないため、その話を事実として提示することはできません。いずれにせよ、防御可能な要件はより強力です。存在するテキストの量や準備にどれだけ時間がかかったとしても、パターンのコンパイルが失敗した場合は常にユーザー テキストは変更されない必要があります。
検索と置換ツールが防止する必要がある破壊的な障害
正規表現は、通常、1 回の完全なキーストロークで入力されるわけではありません。ユーザーは、閉じ括弧の前に開き括弧を入力するか、メンバーを追加する前に開き括弧で文字クラスを開始します。この間、編集プロセスは正常に進行しているにもかかわらず、フィールドには構文的に不完全なパターンが含まれています。
その一時的な状態を例外的なユーザー動作として扱うと、脆弱なエディターが生成されます。有用な応答は即時のローカルなフィードバックです。つまり、現在のパターンがコンパイルできないことを示し、他のすべてのフィールドを保持し、次のキーストロークで修復させます。無効な正規表現エラーは、ワークフローを終了させるのではなく、現在のドラフトを説明する必要があります。
正規表現の書き込み中に不完全なパターンが発生するのは正常です
ToolAcre は、ユーザーが指定したすべての検索を `compilePattern` 経由でルーティングします。リテラル検索では最初に正規表現メタ文字がエスケープされますが、正規表現モードでは指定されたソースが直接使用されます。コンパイルは `try` ブロック内で行われ、失敗すると JavaScript 例外がインターフェイスにエスケープされるのではなく、null パターンとエラー文字列が返されます。
その結果は置換パスを制御します。コンパイルでエラーが報告されると、`findReplace` は元のテキスト、ゼロ置換、およびエラーを返します。部分的な検索や書き換えは試行しません。したがって、ガードはインターフェイスの安定性とデータの整合性の両方を保護します。有効なパターンがないということは、エディターの内容が変更されていないことを意味します。
何が起こったかを報告する — 各実行後の交換カウントが最も早い健全性チェックである理由
置換が成功しても、論理的に間違っている可能性があります。広範な式は意図したよりも多くの日付に一致する可能性がありますが、大文字と小文字のオプションまたは単語全体の境界によりセットが 0 に減らされる可能性があります。 ToolAcre は、標準の文字列置換を呼び出す前に一致をカウントし、書き換えられたテキストとともにその数値を返し、各実行後にスコープを表示します。
カウントは、すべての一致が望ましいものであったことを証明するものではなく、迅速な健全性チェックです。 12 レコードが予期され、結果が 1 または 1,200 である場合は、出力をコピーする前にパターンを停止して検査します。正確な数字は、漠然とした疑惑を、調査を取り消して修正するための具体的な理由に変えます。
セーフティ ネットとしての元に戻す - すべての変換を元に戻すことができ、文書化された 50 操作の制限付き
コンパイルの安全性により、無効なパターンによるテキストの変更は防止されますが、有効なパターンでも誤った意図が表現される可能性があります。 Undo は 2 番目のカテゴリをカバーします。テキスト ツールキットは変換を記録するため、結果の数または出力によって検索範囲が広すぎる、狭すぎる、または正しくグループ化されていないことが判明した後で、完了した置換を元に戻すことができます。
文書化された履歴の制限は 50 操作であるため、元に戻すは永続的なバージョン管理ではなく作業バッファーとなります。これを小さなステップで実験するために使用しますが、アーカイブ ストレージとして扱わないでください。重要な資料については、オリジナルを別途保管し、テキストと置換カウントの両方を確認した後でのみ完成した出力をコピーしてください。
実用的な例 — 日付の再フォーマット パターンを 1 文字ずつ構築し、テキストを失わずにエラーが表示されたり消えたりするのを観察する
日付を `2024-01-02` から `02/01/2024` に変更することを検討してください。 Regex を有効にし、左かっこで始めます。その瞬間、ブラウザ エンジンは無効な式を報告し、ToolAcre がメッセージを表示し、テキストはそのまま残ります。 `\d{4}` と右括弧を追加すると、最初に取得された年が有効になります。
検索が `(\d{4})-(\d{2})-(\d{2})` になるまで続行し、その後 `$3/$2/$1` を置換として使用します。 3 つのキャプチャでは、各行を再入力することなく、年、月、日の順序が変更されます。 「すべて置換」を実行し、報告された数と予想される行を比較し、無関係な数値テキストも一致した場合はすぐに元に戻します。
これでカバーされないもの — 巨大な入力に対する壊滅的なバックトラッキングなどの正規表現のパフォーマンスの問題
コンパイル ガードは、有効な式の実行時間ではなく、構文エラーに対処します。パターンは正常にコンパイルできますが、特定の入力で大幅にバックトラックすることがあります。置換はメイン スレッドで実行されるため、大きなドキュメントに異常な表現が適用されると、たとえ例外がスローされなかったとしても、ブラウザー タブが応答しなくなる可能性があります。
このツールは、一致を個別にステップ実行するのではなく、すべて置換も実行します。また、突然変異の前に強調表示された一致をプレビューしません。これらの制限により、狭いテスト データと置換数が重要になります。馴染みのない式を、大きな文書の唯一のコピーに適用する前に、小さな代表的なサンプルで検証します。
重要な点 — テキスト ツールキットは無効なパターンを失敗ではなく情報として扱うため、安全に実験できます
不完全なパターンは編集状態に関する情報であり、ユーザーが失敗したという証拠ではありません。 ToolAcre は戻り値でその区別を維持します。コンパイルではスローせずにエラーを報告でき、置換ではソースに触れることなくゼロの変更を報告でき、成功した操作では書き換えられた一致の数を正確に報告できます。
この設計は、正規表現が無害であるかのように装うことなく、実験をサポートします。コンパイル失敗時に入力を保存し、成功後にカウントを検査し、有効なパターンが概念的に間違っていた場合は元に戻すを使用します。これらの動作を組み合わせることで、中途半端に入力された式に対する罰よりもフィードバックを必要とする時折の正規表現ユーザーにとって、検索と置換が十分に予測可能になります。