这个正则表达式应该匹配所有非 ASCII 字符,0-128 个代码点:
/[^x00-x7F]/i
想象一下,我想(只是出于好奇)用所有 Unicode 字符(0-1114111 个代码点)测试这个正则表达式。
生成这个范围可能很简单range(0, 1114111)
。然后我应该用函数将每个十进制数转换为十六进制dechex()
。
之后,如何将十六进制数字转换为实际字符?以及如何排除 ASCII 方案中已有的字符?
这取决于您将如何进行匹配以及您是否要将 PCRE 正则表达式引擎放入带有修饰符的UTF-8 模式。/u
如果您确实使用了/u
修饰符,那么首先您必须对正则表达式和主题都使用 UTF-8 编码,并且正则表达式引擎会自动将合法的 UTF-8 字节序列解释为一个字符。在此模式下,正则表达式[^x00-x7F]
将匹配Latin-1 补充块之外的所有字符,包括代码点大于 255 的字符。您还需要手动生成每个字符(给定其代码点)的 UTF-8 表示。
如果您不使用/u
修饰符,那么正则表达式引擎将是愚蠢的:它将每个字节视为一个单独的字符,这意味着您必须在字节而不是字符级别工作。另一方面,您现在可以使用您喜欢的任何编码。但是,您将不得不放弃[^x00-x7F]
正则表达式(因为它只会匹配字符串中的随机字节)并使用体现您选择的编码规则的正则表达式(例如 UTF-8)。要生成随机字符的编码形式,您将再次需要使用取决于特定编码的自定义代码。
我认为hex2bin(string)函数会将十六进制字符串转换为二进制字符串。要排除 ASCII 字符代码点,只需从 x80 十六进制代码点开始(跳过 x00 到 x7F)。
但这听起来确实有点像您正在尝试对正则表达式库进行单元测试,这似乎是不必要的,除非您正在开发正则表达式库,或者您需要非常偏执。