![编辑-正则表达式解释](https://linux22.com/image/1531234/%E7%BC%96%E8%BE%91-%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E8%A7%A3%E9%87%8A.png)
我正在努力想出一个正则表达式,用于在 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 编码。