我正在为 Swift 中 Turtle 格式的 RDF 数据编写解析器。Turtle Grammar 将模式定义PN_CHARS_BASE
为
[163s] PN_CHARS_BASE ::= [A-Z] | [a-z] | [#x00C0-#x00D6] | [#x00D8-#x00F6] | [#x00F8-#x02FF] | [#x0370-#x037D] | [#x037F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]
(参见W3C 海龟推荐)。
模式中的最后一组[#x10000-#xEFFFF]
超出了 UTF-16 字符串编码的范围。这里需要 UTF-32。
例如,此模式用于匹配前缀字符串中前缀中的第一个字符,例如foaf
in foaf:name
,此处不允许使用数字。
我想NSRegularExpression
用来解析海龟文件。所以为了匹配PN_CHARS_BASE
模式,我有以下代码进行测试:
let PN_CHARS_BASE = "[A-Z]|[a-z]|[\\u00C0-\\u00D6]|[\\u00D8-\\u00F6]|[\\u00F8-\\u02FF]|[\\u0370-\\u037D]|[\\u037F-\\u1FFF]|[\\u200C-\\u200D]|[\\u2070-\\u218F]|[\\u2C00-\\u2FEF]|[\\u3001-\\uD7FF]|[\\uF900-\\uFDCF]|[\\uFDF0-\\uFFFD]|[\\u10000-\\uEFFFF]"
do {
let teststr = "9"
let regex = try NSRegularExpression(pattern: PN_CHARS_BASE, options: [])
let matches = regex.matchesInString(teststr, options: [], range: NSMakeRange(0, teststr.characters.count)) as Array<NSTextCheckingResult>
} catch {
}
当我通过调试器运行它时,正则表达式在测试字符串上返回一个结果9
。但是此模式不允许使用数字(因此正则表达式不应返回任何匹配项)。我删除了部分正则表达式模式以确定正则表达式的哪一部分与数字匹配,9
并发现正则表达式的最后一部分[\u10000-\uEFFFF]
与9
. 这是模式中唯一使用 UTF-32 而不是 UTF-16 的部分,包括埃及象形文字等字符。
你知道是否NSRegularExpression
能够支持 UTF-32 字符?或者任何其他支持 UTF-32 匹配的解决方案?