
我正在努力在記事本++中找到一個正則表達式,它可以查找並替換 x 個位元組。回車符 (0D) 計數,換行符號 (0A) 計數。
這是我正在嘗試的正規表示式:(0C 是我的開始,我將刪除 0C 之後的 318 個位元組以及 0C)
\x0C(.{318})
這個正規表示式沒有找到任何東西,它說沒有找到匹配項。我可以找到\x0C
,我可以找到.
,但我找不到.{318}
也.
跳過 0x0A 和 0x0D
- 環繞已檢查。
- 檢查正規表示式。
以下是帶有 ascii 的十六進位檔案的一部分:
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,我們可以假設每個字元都是一個位元組。在正規表示式中,“.”匹配換行符之外的任何字符,並且您希望 CR/LF 換行符的每個單獨部分單獨匹配,因為它們是兩個位元組。
我還將假設您正在處理實際的文字數據,而不是可以包含 us-ascii 字元映射之外的位元組的二進位檔案。
如果以上所有條件均成立,則可使用下列正規表示式:
\x0C[^\xFF]{318}
原因是“.”在您的嘗試中沒有起作用,是因為“.”不符換行符。您也不能使用\x0C[.\r\n]{318}
,因為 '.'通配符在字元類別(方括號組)中不可用。十六進位值 FF 不會對應到 us-ascii 字元集中的任何有效代碼點,因此當您尋找「不是 FF 字元的任何字元」時,您將採用位元組考慮在內。
請記住,此方法將 windows/mac 換行符計為兩個字元/位元組(根據您的請求)。
希望這就是您正在尋找的...
編輯-正規表示式解釋
充分錶達
\x0C[^\xFF]{318}
讓我們來分解一下。
\x0C
這與單個 Unicode Grapheme 匹配,您可以找到有關此的更多信息在這裡。總之,您可以將 \x 視為點的 Unicode 版本,除了它還可以匹配換行符(這很重要,稍後會詳細介紹)。
但是,既然您也使用過這個,我猜您已經對此有些熟悉了。
[^\xFF]
[] 之間的所有內容稱為字元集(不要與字元編碼中的相同概念混淆)。您可以在 Regexp 教程上閱讀更多相關信息,但總而言之,它充當“OR”語句。 [ab] 簡單地表示「a 或b」。當 ^ 在字元集中使用時,它用作否定。所以[^a]的意思是「不是a」。在我們的用例中,我們查找不是十六進位值 FF 的任何字元。
{318}
我們尋找這種性格,318 次。 {} 語法總是適用於其前面的 Regex 元素,因此在本例中為 [^\xFF] 字元集。
為什麼是\xFF?
在十六進位表示法中,us-ascii 字元集為從 00 到 7E。任何更高的值都無法對應到 us-ascii 代碼點。這意味著任何以 us-ascii 編碼(正確)的檔案只能包含 00 到 7E 之間的十六進位值。因此,它不能包含 FF。
因此,我們可以巧妙地利用它來搜尋包括換行符在內的任何字符,因為 \x.. 也匹配 \x0A 和 \x0C 等換行符。當我們搜尋任何一個字元時不是FF,我們最終發現每一個特點。
請記住,此解決方案取決於您的檔案以 us-ascii 編碼,而不是 UTF-8。