Je suis en train de faire un match simple regex utilisant NSRegularExpression, mais je vais avoir quelques problèmes correspondant à la chaîne lorsque la source contient des caractères multi-octets:correspondant Swift Regex échoue lorsque la source contient des caractères unicode
let string = "D 9"
// The following matches (any characters)(SPACE)(numbers)(any characters)
let pattern = "([\\s\\S]*) ([0-9]*)(.*)"
let slen : Int = string.lengthOfBytesUsingEncoding(NSUTF8StringEncoding)
var error: NSError? = nil
var regex = NSRegularExpression(pattern: pattern, options: NSRegularExpressionOptions.DotMatchesLineSeparators, error: &error)
var result = regex?.stringByReplacingMatchesInString(string, options: nil, range: NSRange(location:0,
length:slen), withTemplate: "First \"$1\" Second: \"$2\"")
Le code ci-dessus renvoie « D » et « 9 » comme prévu
Si je change maintenant la première ligne d'inclure un symbole monétaire « Livre » au Royaume-Uni comme suit:
let string = "£ 9"
Alors e Le match ne fonctionne pas, même si la partie ([\\s\\S]*)
de l'expression doit toujours correspondre à caractères principaux.
Je comprends que le symbole £
prendra deux octets, mais la correspondance générique ignorera ceux qui ne le devraient pas? Quelqu'un peut-il expliquer ce qui se passe ici s'il vous plaît?
Je ne suis pas familier avec Swift et son moteur de regex, mais en général je serais terriblement surpris de constater que '\ s \ S' ne correspond pas à' .' quand Unicode est impliqué. Pourquoi n'utilisez-vous pas '. *' Dans le premier groupe? Cela dit, je ne suis pas entièrement convaincu que c'est là où le problème est; Je pense qu'il est plus probable que '[0-9]' ne corresponde pas aux chiffres unicode que '\ S' ne corresponde pas aux caractères unicode non spatiaux arbitraires. –
Swift * supporte * la classe de caractères '\ d', alors pourquoi utilisez-vous' [0-9] '? Si vous essayez de faire correspondre avec '(. *) (\ D *) (. *)', Obtenez-vous une correspondance? –
Merci Kyle. J'utilisais \ s \ S à cause d'une mauvaise lecture d'un article sur le mauvais usage du '.' personnage. Je l'ai changé pour "(. *) (\ D *) (. *)" Mais il échoue toujours à correspondre. Je commence à soupçonner que c'est un bug dans l'implémentation de Swift - tout autre caractère correspond à OK - par exemple. "D $ + @ 9" mais quand je mets un symbole '£' n'importe où dans la chaîne à faire correspondre, ça échoue! –