编辑-正则表达式解释

编辑-正则表达式解释

我正在努力想出一个正则表达式,用于在 notepad++ 中查找 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 字素匹配,您可以在此处找到更多信息在这里。总而言之,你可以将 \x 视为 Unicode 版本的点,但它也可以匹配换行符(这很重要,稍后会详细介绍)。

但是,由于您也使用过它,我猜您已经对此有所熟悉了。

[^\xFF]

[] 之间的所有内容都称为字符集(不要与字符编码中的相同概念混淆)。您可以在正则表达式教程中阅读更多内容,但总而言之,它充当“OR”语句。[ab] 仅表示“a 或 b”。当 ^ 在字符集内使用时,它用作否定。因此 [^a] 表示“非 a”。在我们的用例中,我们查找不是十六进制值 FF 的任何字符。

{318}

我们查找这种字符 318 次。{} 语法始终适用于它前面的正则表达式元素,因此在本例中为 [^\xFF] 字符集。

为什么是 \xFF?

在十六进制表示法中,us-ascii 字符集为从 00 到 7E。任何高于此值的值都无法映射到 us-ascii 代码点。这意味着任何以 us-ascii 编码(正确)的文件只能包含 00 到 7E 之间的十六进制值。因此,它不能包含 FF。

因此,我们可以巧妙地利用这一点来搜索任何字符,包括换行符,因为 \x.. 也匹配换行符,如 \x0A 和 \x0C。当我们搜索任何字符时不是FF,我们最终发现每一个特点。

请记住,此解决方案取决于您的文件是以 us-ascii 编码的,而不是以 UTF-8 编码。

相关内容