編輯-正規表示式解釋

編輯-正規表示式解釋

我正在努力在記事本++中找到一個正則表達式,它可以查找並替換 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。

相關內容