logo BT编程语言
首页动态文档关于登录更新记录
BT编程语言文档

Unicode支持

Unicode 对内存使用和搜索速度的影响

该正则表达式库默认启用了对 Unicode 的全面支持,在大多数情况下,支持Unicode所需的额外内存开销是可以忽略的,并且通常不会影响搜索速度,但在某些情况下可能会有影响。

关于内存使用:

Unicode 的影响主要体现在 Unicode 字符类的使用上。Unicode 字符类往往非常庞大。例如,默认的 \w 匹配大约 14 万个不同的代码点。这需要额外的内存,并可能使正则表达式的编译变慢。虽然偶尔使用 \w 影响不大,但如果你写了 \w{100},那么默认情况下将生成一个相当大的正则表达式。 例如,(?-u:\w) 的 ASCII 版本明显比 Unicode 版本小得多,所以如果你的需求可以通过 ASCII 满足,最好使用 ASCII 字符类。ASCII 版本的 \w 可以通过多种方式表示,以下都是等价的:
  • [0-9A-Za-z_]
  • (?-u:\w)
  • [[:word:]]
  • [\w&&\p{ascii}]

关于搜索速度:

即使使用大型 Unicode 字符类,搜索速度通常也能很好地处理 Unicode。不过,一些更快的内部正则表达式引擎无法处理支持 Unicode 的单词边界断言。因此,如果你不需要 Unicode 感知的单词边界断言,建议使用 (?-u:\b) 代替 \b,前者使用 ASCII 版本的单词字符定义。 总之,虽然启用 Unicode 支持通常不会显著影响内存和性能,但在某些情况下使用 ASCII 类可以减少开销并提升性能。 BT语言的正则完全实现了 Unicode 技术标准 #18(UTS#18)中规定的“基本 Unicode 支持”(第一级)。 字符类 \w、\d 和 \s 默认都是支持 Unicode 的。使用 (?-u:\w) (?-u:\d)(?-u:\s) 可获得仅支持 ASCII 的定义。 类似的 \b 和 \B 使用 Unicode 定义的“单词”字符。若要获得仅支持 ASCII 的单词边界,可使用(?-u:\b)(?-u:\B)。这同样适用于特殊的单词边界断言(即 \b{start}\b{end}\b{start-half}\b{end-half})。 在多行模式下,^ 和 $ 不支持 Unicode,也就是说,它们只识别 \n(假设未启用 CRLF 模式),而不会识别 Unicode 定义的其他行终止符形式。 大小写不敏感的搜索支持 Unicode 并使用简单的大小写折叠。 Unicode 的一般类别、脚本和许多布尔属性默认可通过 \p{property name} 语法使用。 在所有情况下,匹配的结果都使用字节偏移量报告,准确地说,是 UTF-8 编码单元的偏移量。这允许在常数时间内对文本进行索引和切片操作。 在BT中,默认情况下,正则匹配是 Unicode 感知的,这意味着它可能匹配的比你想象的要多。例如:\d