NSRegularExpression 中的 Unicode 字符 (UTF-32) 字符串编码

Die*_*nné 0 regex character-encoding nsregularexpression swift turtle-rdf

我正在为 Swift 中的 Turtle 格式的 RDF 数据编写解析器。海龟语法将模式定义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]
Run Code Online (Sandbox Code Playgroud)

(请参阅W3C Turtle 推荐)。

模式中的最后一组[#x10000-#xEFFFF]超出了 UTF-16 字符串编码的范围。这里需要UTF-32。

这种模式用于匹配,例如,在前缀的第一个字符的字符串前缀,如foaffoaf: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 {

    }
Run Code Online (Sandbox Code Playgroud)

当我通过调试器运行它时,正则表达式在测试字符串上返回一个结果9。但是此模式不允许使用数字(因此正则表达式不应返回匹配项)。我删除了正则表达式模式的一部分以确定正则表达式的哪一部分与数字匹配,9并发现正则表达式的最后一部分[\u10000-\uEFFFF]9. 这是模式中唯一采用 UTF-32 而不是 UTF-16 的部分,并且包括诸如埃及象形文字之类的字符。

你知道是否NSRegularExpression能够支持UTF-32字符?或者任何其他支持 UTF-32 匹配的解决方案?

Die*_*nné 6

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

Not [\u10000-\uEFFFF]but[\U00010000-\U000EFFFF]需要表达完整范围的 unicode 字符。UTF-32 Unicode 代码点以转义的 CAPITAL 开头,\U并且正好需要 8 个十六进制数字。