【发布时间】:2016-05-21 12:05:27
【问题描述】:
我正在为 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]
模式[#x10000-#xEFFFF] 中的最后一组超出了UTF-16 字符串编码的范围。这里需要 UTF-32。
此模式用于匹配,例如foaf:name中的前缀字符串如foaf中的前缀中的第一个字符,此处不允许使用数字。
我想使用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 匹配的解决方案?
【问题讨论】:
标签: regex swift character-encoding nsregularexpression turtle-rdf