0

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]

( 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 {

    }

これをデバッガーで実行すると、正規表現はテスト文字列に対して 1 つの結果を返します9。ただし、このパターンでは数字は許可されていません (したがって、正規表現は一致を返さないはずです)。正規表現パターンの一部を削除して、正規表現のどの部分が数字9と一致したかを判断したところ、正規表現の最後の部分が と[\u10000-\uEFFFF]一致することがわかりました9。これは、UTF-16 ではなく UTF-32 であり、エジプトの象形文字などの文字を含むパターンの唯一の部分です。

NSRegularExpressionが UTF-32 文字をサポートできるかどうか知っていますか? または、UTF-32 マッチングをサポートする他のソリューションはありますか?

4

1 に答える 1

6

私は自分で答えを見つけました。UTF-16 文字とは異なる形式で UTF-32 文字を指定する必要がありました。

ではありません[\u10000-\uEFFFF][\U00010000-\U000EFFFF]、全範囲の Unicode 文字を表現するために必要です。UTF-32 Unicode コード ポイントはエスケープされた大文字で始まり、\U正確に 8 桁の 16 進数が必要です。

于 2016-02-10T22:32:11.240 に答える