日本語

テキストおよび日常ツール · テキスト ツールキット

単語全体の検索の仕組み: 単語の境界と猫/犬の問題

· 仕組み

正規表現 検索と置換 テキスト編集

連結中に境界を通過する猫と犬の単語は変更されません
オリジナル ToolAcre ベクトル イラスト

JavaScript 正規表現における単語境界とは何か、「cat」が「concatenate」内で一致してはいけない理由、境界を追加する前に cat|dog のような代替をグループ化する必要がある理由について説明します。

「連結」を変更した名前変更 — 短い単語の単純な検索と置換が長い単語にダメージを与える理由

製品名の変更は、無関係な単語の中に短い名前が表示されるまでは無害に見えます。 `cat` のすべての出現箇所を `lynx` に置き換えると、動詞の一部の名前を変更する意図のある編集者がいないにもかかわらず、`concatenate` が `conlynxenate` に変更されます。検索ルールが広すぎる場合、一致数だけではドキュメントを保護できません。

単語全体の一致により、置換が行われる前にルールが絞り込まれます。 ToolAcre では、Whole word を有効にすると、スタンドアロンの `cat` が対象になりますが、`concatenate` 内の同じ文字はそのまま残ります。この区別は辞書ベースではなく構造的なものです。正規表現エンジンは、一致する可能性のあるそれぞれのすぐ隣にある文字をチェックします。

\b の意味 — 単語文字と非単語文字の間のゼロ幅の位置

JavaScript 正規表現では、`` はゼロ幅の単語境界をマークします。文字、スペース、句読点は使用されません。代わりに、一方の側が単語文字であり、もう一方の側がそうでない位置 (隣接する文字が単語文字として認定される場合のテキストの開始または終了を含む) で成功します。

JavaScript の `w` カテゴリは、この実装に関連する単語文字 (ASCII 文字、数字、アンダースコア) を提供します。したがって、`cat` は、スペース、コンマ、または行末の横にある `cat` と一致しますが、`concatenate` 内の `cat` セグメントとは一致しません。これは、セグメントの両側が単語文字を通して続いており、そこに境界が存在しないためです。

リテラル モードの単語全体 — 検索テキストは最初にエスケープされ、次に境界で折り返されます。

Regex をオフにすると、ToolAcre はまず、検索テキスト内のすべての正規表現メタ文字をエスケープします。ピリオドは文字通りのピリオドのまま、括弧は文字通りの括弧のまま、プラス記号はプラス記号のままです。このエスケープ手順の後でのみ、単語全体が結果のソースをラップするため、ユーザーの句読点が黙って正規表現構文になることはありません。

ラッパーは表示スペースのない `(?:… )` です。内側の `(?:…)` は非キャプチャ グループです。 `cat` などの単純なリテラルの場合、その効果は `cat` と同等です。 1 つのコンパイル パスでは、キャプチャ グループの番号付けを変更せずに、単純な用語とより複雑な代替語を安全に処理する必要があるため、グループ化は依然として重要です。

正規表現モードの単語全体 — cat|dog をグループとしてバインドする必要がある理由、または境界が 1 つのブランチのみにバインドされる理由

Regex モードでは、入力されたパターンはそのまま残りますが、Wh​​ole Word では境界を追加する前にパターンがグループ化されます。 `cat|dog` の場合、ToolAcre は概念形式 `(?:cat|dog)` をコンパイルします。したがって、どちらの選択肢も単語境界で開始および終了する必要があるため、スタンドアロン `cat` とスタンドアロン `dog` は同じルールで一致します。

このグループがないと、`cat|dog` は 2 つの分岐に分割されます。左側の境界は `cat` のみを拘束し、右側の境界は `dog` のみを拘束します。代替は周囲のシーケンスより優先順位が低くなります。グループ化とは、1 つのアサーションを不均等に分散するのではなく、両方の境界アサーションを選択全体に適用するものです。

実用的な例 — 全単語をオンにしてドキュメント全体で製品の名前を変更し、期待に反して置換カウントを検査する

`cat`、`dog`、`concatenate`、`dogged` と、`cat, dog.` などの句読点を含む代表的な文章を貼り付けます。 `cat|dog` と入力し、正規表現と完全な単語をオンにして、新しい製品名ですべて置換を実行します。 2 つの独立した動物の言葉は変更されるべきです。長い単語はそのままにしておく必要があります。

編集を受け入れる前に、報告された置換数を読んでください。ドキュメントに既知のスタンドアロン参照が 3 つあるにもかかわらず、ツールが 2 つまたは 12 つを報告する場合は、[元に戻す] を選択してサンプル コンテキストを調べます。 ToolAcre は、標準の文字列置換を呼び出す前に一致をカウントするため、表示される合計は、実際にコンパイルした検索ルールの実用的なチェックとなります。

単語の境界に驚くところ — JavaScript の単語文字は ASCII 文字、数字、アンダースコアであるため、アクセント付きの単語や非ラテン語の単語はテストが必要です

これらの境界には、多言語辞書や Unicode テキスト分割アルゴリズムは実装されていません。アクセント付き文字と非ラテン文字は、ここで使用される ASCII スタイルの単語カテゴリの外にあるため、単語全体がゼロを返したり、次のような用語に対して予期しない端の位置が生成されたりする可能性があります。`café`。検索語内の句読点も同様の不一致を引き起こす可能性があります。

一括編集する前に、特にアクセント、アポストロフィ、またはハイフンを含む名前について、正確な言語とスペルをテストしてください。境界アサーションは、隣接する文字カテゴリのみを比較します。タイポグラフィーが人間の 1 つの単語を構成するかどうかはわかりません。サンプルが失敗した場合は、チェックボックスを信頼するのではなく、それらの環境に合わせて意図的に設計された正規表現を使用してください。

JavaScript の単語境界が驚くところ: ASCII スタイルの単語文字は言語上の単語ではありません

このツールは、インターフェイスに大文字と小文字の処理が存在しないという意味とは対照的に、大文字と小文字を区別する別のオプションを提供します。これをクリアすると、JavaScript の大文字と小文字を区別しないフラグが追加されます。ただし、実装ではグローバル マッチングとオプションの大文字と小文字の区別のみが使用されます。 Unicode、複数行、ドットオール、スティッキー、その他のフラグは追加されません。

また、この記事では、`` を Unicode 対応境界に変更したり、言語固有のトークン化を解決したりすることはありません。このツールは Unicode フラグを使用してパターンをコンパイルしないため、ここでは JavaScript プロパティ エスケープは代わりになりません。多言語の編集作業の場合は、明示的なテスト ケースを確立し、使用中のブラウザ エンジンでサポートされているパターンを選択します。

ツールには大文字と小文字のオプションが存在します。 Unicode 対応の単語境界はありません。

単語全体は合成ルールであり、2 番目の置換エンジンではありません。リテラル モードでは検索をエスケープします。正規表現モードではそれが保持されます。この場合、同じ非キャプチャ グループと 2 つの境界がいずれかの結果を囲みます。この順序により、リテラルの句読点が保護され、`cat|dog` などの正規表現の代替が 1 つの制限された式として動作します。

スタンドアロンの ASCII スタイルの用語が対象となる場合にこのオプションを使用し、置換カウントと元に戻すコントロールを装飾ではなく保護手段として扱います。 ToolAcre の検索と置換を開き、スタンドアロン サンプルと埋め込みサンプルの両方に対して変更をテストし、それらのサンプルが期待どおりに動作した後でのみ、完全なドキュメントに適用します。