0

J'écris un analyseur pour les données RDF au format Turtle dans Swift. La grammaire tortue définit le crépitement PN_CHARS_BASE commeCaractères Unicode (UTF-32) Chaîne de codage dans NSRegularExpression

[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] 

(voir le W3C Turtle recommendation).

Le dernier groupe du modèle [#x10000-#xEFFFF] est en dehors de la plage de codage de chaîne UTF-16. UTF-32 est nécessaire ici.

Ce motif est utilisé pour faire correspondre, par exemple, le premier caractère du préfixe dans une chaîne préfixée telle que foaf dans foaf:name, les chiffres ne sont pas autorisés ici.

Je voudrais utiliser NSRegularExpression pour analyser des fichiers de tortue. Donc, pour correspondre au modèle PN_CHARS_BASE, j'ai le code suivant pour les tests:

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 { 

    } 

Quand je lance ce à travers le débogueur, l'expression régulière retourne un résultat sur la chaîne de test 9. Mais les nombres ne sont pas autorisés pour ce modèle (l'expression rationnelle ne devrait donc renvoyer aucune correspondance). J'ai enlevé des parties du motif regex pour déterminer quelle partie de l'expression régulière correspondait au nombre 9 et a découvert que la dernière partie de l'expression régulière [\u10000-\uEFFFF] correspond à 9. C'est la seule partie du modèle qui est en UTF-32 et non en UTF-16 et inclut des caractères tels que les hiéroglyphes égyptiens. Savez-vous si le NSRegularExpression est capable de supporter les caractères UTF-32? Ou de toute autre solution pour supporter l'appariement UTF-32?

Répondre

3

Je viens de trouver la réponse moi-même. J'avais besoin de spécifier les caractères UTF-32 dans un format différent des caractères UTF-16.

Pas [\u10000-\uEFFFF] mais [\U00010000-\U000EFFFF] est nécessaire pour exprimer la gamme complète des caractères Unicode. Le point de code Unicode UTF-32 commence par un CAPITAL \U échappé et nécessite exactement 8 chiffres hexadécimaux.