0

背景

我正在编写一个基于 DFA 的正则表达式解析器,出于性能原因,我需要使用字典[Unicode.Scalar : State]来映射下一个状态。现在我需要一堆特殊的 unicode 值来表示特殊的字符表达式,如., \w, \d...

我的问题

哪些 unicode 值可以安全地用于此目的?

我正在使用U+0000for .,但我现在需要更多。我检查了 unicode 文档,Noncharacters似乎很有希望,但很快,那些被认为是无效的 unicode。例如,下面的代码给了我一个编译器错误Invalid unicode scalar

let c = "\u{FDD0}"
4

1 回答 1

1

如果你坚持使用Unicode.Scalar,什么都没有。Unicode.Scalar旨在表示 Unicode 中的所有有效字符,包括尚未分配的代码点。因此,它不能表示非字符或悬空代理("\u{DC00}"也会导致错误)。

而在 Swift 中,String可以包含所有有效Unicode.Scalar的 s,包括U+0000. 例如"\u{0000}"(== "\0") 是一个有效的字符串,它的长度 ( count) 是 1。使用U+0000作为元字符时,您的代码将无法使用有效的 Swift 字符串。


考虑使用[UInt32: State]而不是[Unicode.Scalar: State]. Unicode 仅使用0x0000...0x10FFFF(包括非字符),因此使用大于的值0x10FFFF安全的(按照您的意思)。

获得value的属性也Unicode.Scalar需要非常小的成本,并且在优化代码中可以忽略它的成本。我不确定 usingDictionary真的是处理您的要求的好方法,但[UInt32: State]会像[Unicode.Scalar: State].

于 2017-08-03T01:08:04.240 回答