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 が必要です。
このパターンは、たとえば、 などの接頭辞付き文字列の接頭辞の最初の文字と一致させるために使用されます。ここfoaf
で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 {
}
これをデバッガーで実行すると、正規表現はテスト文字列に対して 1 つの結果を返します9
。ただし、このパターンでは数字は許可されていません (したがって、正規表現は一致を返さないはずです)。正規表現パターンの一部を削除して、正規表現のどの部分が数字9
と一致したかを判断したところ、正規表現の最後の部分が と[\u10000-\uEFFFF]
一致することがわかりました9
。これは、UTF-16 ではなく UTF-32 であり、エジプトの象形文字などの文字を含むパターンの唯一の部分です。
NSRegularExpression
が UTF-32 文字をサポートできるかどうか知っていますか? または、UTF-32 マッチングをサポートする他のソリューションはありますか?