快速入门
教程
工具和语言
示例
参考
书评
示例
正则表达式示例
数字范围
浮点数
电子邮件地址
IP 地址
有效日期
数字日期转文本
信用卡号
匹配整行
删除重复行
编程
两个相近的单词
陷阱
灾难性回溯
重复次数过多
拒绝服务
使所有内容都可选
重复捕获组
混合 Unicode 和 8 位
此网站上的更多内容
简介
正则表达式快速入门
正则表达式教程
替换字符串教程
应用程序和语言
正则表达式示例
正则表达式参考
替换字符串参考
书评
可打印 PDF
关于此网站
RSS 提要和博客
RegexBuddy—The best regular expression debugger!

混合 Unicode 和 8 位字符代码

在内部,计算机处理的是数字,而不是字符。保存文本文件时,每个字符都会映射到一个数字,然后将这些数字存储在磁盘上。打开文本文件时,会读取这些数字并将其映射回字符。使用正则表达式处理文本时,正则表达式需要使用与创建文件或字符串(希望正则表达式处理该字符串)时所用的映射相同。

在正则表达式中简单输入所有字符时,通常无需担心。提供正则表达式功能的应用程序或编程库将知道主题字符串使用的文本编码,并相应地对其进行处理。因此,如果你想搜索欧元货币符号,并且使用的是欧洲键盘,只需按 AltGr+E 即可。正则表达式 将很好地找到所有欧元符号。

但你无法在美式键盘上按 AltGr+E。或者,你可能希望源代码是 7 位干净的(即纯 ASCII)。在这些情况下,你需要在正则表达式中使用字符转义。

如果您的正则表达式引擎支持Unicode,只需使用 Unicode 转义 \u20AC(大多数 Unicode 风格)或 \x{20AC}PerlPCRE)。U+20AC 是欧元符号的 Unicode 代码点。它将始终匹配欧元符号,无论您的主题字符串是使用 UTF-8、UTF-16、UCS-2 还是其他任何方式进行编码的。即使您的主题字符串使用旧版 8 位代码页进行编码,也不会造成混淆。您可能需要告诉应用程序或正则表达式引擎您的文件使用什么编码。但 \u20AC 始终是欧元符号。

大多数 Unicode 正则表达式引擎还支持 8 位字符转义 \xFF。但是,不建议使用它。对于字符 \x00\x7F,通常没有问题。前 128 个 Unicode 代码点与大多数 8 位代码页所基于的 ASCII 表相同。

但对 \x80 及以上内容的解释可能有所不同。纯 Unicode 引擎会将此视为与 \u0080 相同,它表示 Latin-1 控制代码。但大多数人期望 \x80 匹配欧元符号,因为在所有 Windows 代码页中它都占据 80h 的位置。如果您的文本文件使用 Windows 代码页进行编码,则使用 8 位正则表达式引擎时它将匹配欧元符号。

由于大多数人期望 \x80 被视为 8 位字符而不是 Unicode 代码点 \u0080,因此一些 Unicode 正则表达式引擎会完全这样做。有些引擎被硬编码为使用特定的代码页(例如 Windows 1252 或您计算机的默认代码页)来解释 8 位字符代码。

其他引擎会让它依赖于输入字符串。Just Great Software 应用程序在搜索 Unicode 文本文件时将 \x80 视为 \u0080,但在搜索 Windows 1252 文本文件时将其视为 \u20AC。这里没有魔法。它匹配文本文件中索引为 80h 的字符,而不管文本文件的编码如何。Unicode 代码点 U+0080 是拉丁语-1 控制代码,而 Windows 1252 字符索引 80h 是欧元符号。反过来,如果你在文本编辑器中输入欧元符号,将其另存为 UTF-16LE 将保存两个字节 AC 20,而另存为 Windows 1252 将给你一个字节 80

如果你发现上述内容令人困惑,只需不要通过 \x80\xFF 使用支持 Unicode 的正则表达式引擎。

8 位正则表达式引擎

在使用仅适用于 8 位数据的旧版(过时?)正则表达式引擎时,你不能使用 Unicode 转义,如 \u20AC\x80 是你拥有的全部。请注意,即使是现代引擎也有旧版模式。例如,流行的正则表达式库 PCRE 默认情况下作为 8 位引擎运行。如果你想使用 Unicode 功能,你需要明确启用 UTF-8 支持。当你这样做时,PCRE 也希望你将你的主题字符串转换为 UTF-8。

在为 8 位引擎制作正则表达式时,你必须考虑将使用哪个字符集或代码页。8 位正则表达式引擎根本不在乎。如果你在正则表达式中键入 \x80,它将匹配任何字节 80h,而不管该字节表示什么。在 Windows 1252 文本文件中,它将是欧元符号,在拉丁语-1 文件中是控制代码,在 EBCDIC 文件中是数字零。

即使对于正则表达式中的文字字符,你也必须将正则表达式中使用的编码与主题编码匹配起来。如果你的应用程序使用拉丁语-1 代码页,并且你使用正则表达式 À,当你搜索拉丁语-2 文本文件时,它将匹配 Ŕ。应用程序会将其显示为 À 在屏幕上,因为它使用了错误的代码页。此问题并不真正特定于正则表达式。每当你使用使用不同 8 位编码的文件和应用程序时,你都会遇到它。

因此,在使用 8 位数据时,在十六进制编辑器中打开你正在处理的实际数据。查看正在使用的字节,并在正则表达式中指定这些字节。

如果使用 8 位引擎处理 Unicode 文件,情况会变得非常复杂。让我们回到只有欧元符号的文本文件。当以小端 UTF-16(在 Windows 中称为“Unicode”)保存时,8 位正则表达式引擎将看到两个字节 AC 20(记住,小端会颠倒字节顺序)。当以 UTF-8(没有端序)保存时,我们的 8 位引擎将看到三个字节 E2 82 AC。您需要 \xE2\x82\xAC 才能使用 8 位正则表达式引擎匹配 UTF-8 文件中的欧元符号。