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
print "𝟚𝟘𝟙𝟘-𝟘𝟛-𝟙𝟜".match(/^\d{4}-\d{2}-\d{2}$/) // 输出 [𝟚𝟘𝟙𝟘-𝟘𝟛-𝟙𝟜]