Expressions régulières dans une application Objective-C Cocoa

Initial Googling indique qu’il n’existe aucun moyen intégré de faire des expressions régulières dans une application Objective-C Cocoa.

Donc quatre questions:

  1. Est-ce vraiment vrai?

  2. Vous plaisantez j’espère?

  3. Ok, y a-t-il une belle bibliothèque open-source que vous recommandez?

  4. Comment se rapprocher suffisamment sans importer une bibliothèque, peut-être avec la classe NSScanner?

J’ai remarqué qu’à partir d’iOS 4.0, Apple fournit une classe NSRegularExpression . De plus, à partir de 10.7, la classe est disponible sous OS X.

  1. Oui, il n’y a pas de support regex dans Cocoa. Si vous êtes uniquement intéressé par la correspondance booléenne, vous pouvez utiliser NSPredicate qui prend en charge la syntaxe regex ICU. Mais généralement, vous êtes intéressé par la position de la correspondance ou de la position des sous-expressions, et vous ne pouvez pas l’obtenir avec NSPredicate.
  2. Comme mentionné précédemment, vous pouvez utiliser les fonctions de regex POSIX . Mais ils sont considérés comme lents, et la syntaxe regex est limitée par rapport aux autres solutions (ICU / pcre ).
  3. Il existe de nombreuses bibliothèques OSS, CocoaDev a une liste exhaustive .
  4. RegExKitLite par exemple ne nécessite aucune bibliothèque, ajoutez simplement le .m et le .h à votre projet.

    (Ma plainte contre RegExKitLite est qu’elle étend NSSsortingng via une catégorie, mais elle peut aussi être considérée comme une fonctionnalité. Elle utilise également les bibliothèques ICU non publiques fournies avec le système d’exploitation, ce qui n’est pas recommandé par Apple.)

RegexKit est le meilleur que j’ai trouvé pour le moment. Très cacao: y. J’utilise la version “Lite” dans plusieurs de nos applications iPhone:

sourceforge

lingonikorg

Vous pouvez utiliser la bibliothèque POSIX Regular Expressions (Yay pour un système d’exploitation compatible POSIX). Essayer

 man 3 regex 

La solution de piratage bon marché et sale que j’utilise pour résoudre les problèmes d’parsing REGEX et JSON consiste à créer un object UIWebView et à injecter des fonctions Javascript pour effectuer l’parsing. La fonction javascript retourne alors une chaîne de la valeur (ou liste de valeurs) dont je me soucie. En fait, vous pouvez stocker un petit ensemble de fonctions de bibliothèque personnalisées pour des tâches particulières, puis les appeler selon vos besoins.

Je ne sais pas si cette technique est adaptée à des volumes énormes de requêtes d’parsing répétées, mais pour des opérations transactionnelles rapides, elle fait le travail sans dépendre de ressources externes ou de code supplémentaires que vous pourriez ne pas comprendre.

J’aime le framework AGRegex qui utilise PCRE, pratique si vous êtes habitué à la syntaxe PCRE. La meilleure version de ce framework est celle du client Colloquy IRC car il a été mis à jour pour utiliser PCRE 6.7:

http://colloquy.info/project/browser/trunk/Frameworks/AGRegex

C’est très léger, beaucoup plus que RegExKit (bien que pas aussi capable bien sûr).

NSRegularExpression est disponible depuis Mac OS X 10.7 et IOS 4.0.

Lors de mes recherches sur ce sujet, je suis tombé sur CocoaOniguruma, qui utilise Oniguruma , le moteur d’expression régulière derrière Ruby1.9 et PHP5. Cela semble un peu plus récent par rapport à l’ OregKit existant (en japonais). Vous ne savez pas comment ils se comparent aux autres liaisons.

Googling peu, a trouvé cette bibliothèque: RegexOnNSSsortingng

Bibliothèque open source, contenant des fonctions telles que:

 -(NSSsortingng *) ssortingngByReplacingRegexPattern:(NSSsortingng *)regex withSsortingng:(NSSsortingng *) replacement caseInsensitive:(BOOL)ignoreCase 

et en utilisant la classe NSRegularExpression . Très facile à utiliser et pas besoin de s’inquiéter de rien.

Veuillez noter que NSRegularExpression est disponible depuis Mac OS X 10.7 et IOS 4.0, comme mentionné dans Datasmid.

Je facilite les choses J’ajoute un nouveau fichier C ++ à mon projet Objective C, le renomme en .mm, puis crée une classe C ++ standard. Ensuite, je crée une méthode de classe statique dans la section “public:” pour une fonction C ++ qui prend un NSSsortingng et renvoie un NSSsortingng (ou NSArray, si c’est ce que vous voulez). Je convertis ensuite NSSsortingng en C ++ std :: ssortingng comme ceci:

 // If anyone knows a more efficient way, let me know in the comments. // The "if" condition below is because ObjC crashes if converting to // std::ssortingng if the ssortingng is nil or empty. // assume #include  std::ssortingng s = ""; if (([sInput != nil]) && (!([sInput isEqualTo:@""]))) { std::ssortingng sTemp([sInput UTF8Ssortingng]); s = sTemp; } 

De là, je peux utiliser regex_replace comme ceci:

 // assume #include  std::ssortingng sResult = std::regex_replace(sSource,sRegExp,sReplaceWith); 

Ensuite, je peux convertir cette chaîne std :: ssortingng en NSSsortingng avec:

 NSSsortingng *sResponse2 = @(sResult.c_str()); 

Si vous n’utilisez que ce C ++ uniquement pour cette fonction, vous pourrez alors appeler ce fichier extra.mm (nom de classe Extra) et insérer cette méthode de classe statique, puis append d’autres méthodes de classe statiques à l’arrivée de la situation où il est logique de le faire en C ++, car il est moins compliqué dans certains cas. (Il y a des cas où ObjC fait quelque chose avec moins de lignes de code, et certains cas où C ++ le fait avec moins de lignes de code.)

PS Encore une autre manière d’utiliser un fichier .mm mais de créer un wrapper Objective C autour de l’utilisation de std :: ssortingng et std :: regex_replace () (ou regex_match ()).