
Notepad++ で x バイトを検索して何もないものに置き換える正規表現を思いつくのに苦労しています。復帰 (0D) はカウントされ、改行 (0A) はカウントされます。
これは私が試している正規表現です: (0C は私の始まりで、0C とともに 0C の後の 318 バイトを削除しています)
\x0C(.{318})
この正規表現では何も見つかりません。一致するものが見つからないと表示されます。 は見つかります\x0C
が、.
0x0Aと0x0D.{318}
もスキップされます。.
-wrap around がチェックされます。
-正規表現がチェックされます。
以下は、ASCII を使用した 16 進数のファイルの一部です。
0C 30 31 32 27 34 35 36 0D 0A 30 61 32 0D 33 34 0A [snip] 0C 32 0A 0D 35 [etc..]
<ff>0 1 2 ' 4 5 6<cr><lf>0 a 2<cr> 3 4<lf>[snip]<ff> 2<lf><cr>5 [etc..]
答え1
エンコードが us-ascii であるとおっしゃっているので、各文字は 1 バイトであると想定できます。正規表現では、「.」は改行を除くすべての文字に一致しますが、CR/LF 改行の各部分は 2 バイトであるため、個別に一致させる必要があります。
また、処理しているのは実際のテキスト データであり、us-ascii 文字マッピングの外側のバイトを含む可能性のあるバイナリ ファイルではないと想定します。
上記のすべてが当てはまる場合は、次の正規表現を使用できます。
\x0C[^\xFF]{318}
'.' が機能しなかった理由は、'.' が改行と一致しないためです。また、\x0C[.\r\n]{318}
'.' ワイルドカードは文字クラス (角括弧グループ) 内では使用できないため、 も使用できません。16 進値 FF は、us-ascii 文字セット内の有効なコードポイントにマップされないため、「FF 文字以外の任意の文字」を検索すると、次のようになります。バイト考慮に入れてください。
このメソッドでは、Windows/Mac の改行文字は 2 文字/バイトとしてカウントされることに注意してください (リクエストに応じて)。
これがあなたが探していたものであることを願っています...
編集 - 正規表現の説明
完全な表現
\x0C[^\xFF]{318}
これを詳しく見てみましょう。
\x0C
これは単一のUnicodeグラフィムと一致します。これに関する詳細情報はこちらまとめると、\xはドットのUnicode版と考えることができますが、改行にもマッチする(これは重要なので、これについては後で詳しく説明します)。
しかし、あなたもこれを使用したことがあるので、すでにある程度はご存知だと思います。
[^\xFF]
[]で囲まれた部分はキャラクターセット(文字エンコードの同じ概念と混同しないでください)。詳細については、Regexp Tutorial を参照してください。要約すると、これは「OR」ステートメントとして機能します。[ab] は単に「a または b」を意味します。^ が文字セット内で使用される場合、否定として機能します。したがって、[^a] は「a ではない」を意味します。このユースケースでは、HEX 値 FF 以外の文字を検索します。
{318}
そして、この種類の文字を 318 回検索します。{} 構文は常にその直前の Regex 要素に適用されるため、この場合は [^\xFF] 文字セットになります。
なぜ\xFFなのでしょうか?
16進表記では、us-ascii文字セットは00から7Eまでそれ以上の値は、us-ascii コードポイントにマッピングできません。つまり、us-ascii で (正しく) エンコードされたファイルには、00 から 7E までの HEX 値しか含めることができません。結果として、FF を含めることはできません。
\x..は\x0Aや\x0Cのような改行文字にもマッチするので、これを巧みに利用して改行文字を含む任意の文字を検索することができます。ないFF、結局私たちは毎キャラクター。
この解決策は、ファイルが UTF-8 ではなく us-ascii でエンコードされているという事実に依存していることに注意してください。