0

我正在为 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。

例如,此模式用于匹配前缀字符串中前缀中的第一个字符,例如foafin 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 匹配的解决方案?

4

1 回答 1

6

我自己找到了答案。我需要以不同于 UTF-16 字符的格式指定 UTF-32 字符。

不是[\u10000-\uEFFFF][\U00010000-\U000EFFFF]需要表达全范围的 unicode 字符。UTF-32 Unicode 代码点以转义大写字母开头,\U并且需要正好 8 个十六进制数字。

于 2016-02-10T22:32:11.240 回答