web-dev-qa-db-fra.com

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

La recherche initiale indique qu'il n'existe pas de méthode intégrée pour créer 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, alors recommandez-vous une belle bibliothèque open-source?

  4. Quels sont les moyens de s'approcher suffisamment sans importer une bibliothèque, peut-être avec la classe NSScanner?

173
dreeves

J'ai remarqué que depuis iOS 4.0 Apple fournit un classe NSRegularExpression . De plus, à partir de 10.7, la classe est disponible sous OS X .

141
Philip Jespersen
  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 la syntaxe regex de NSPredicate , qui prend en charge ICU. Mais vous êtes généralement intéressé par la position de la correspondance ou de la position de sous-expressions, et vous ne pouvez pas l'obtenir avec NSPredicate.
  2. Comme mentionné, vous pouvez utiliser fonctions POSIX regex . Mais elles sont considérées comme lentes et la syntaxe des expressions rationnelles est limitée par rapport aux autres solutions (ICU/ pcre ).
  3. Il existe de nombreuses bibliothèques OSS, CocoaDev en a une longue liste .
  4. RegExKitLite par exemple, ne nécessite aucune bibliothèque, ajoutez simplement les fichiers .m et .h à votre projet.

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

42
mfazekas

RegexKit est le meilleur que j'ai trouvé à ce jour. Très cacao: y. J'utilise la version "Lite" dans plusieurs de nos applications iPhone:

sourceforge

lingonikorg

19
avocade

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

man 3 regex
11
Adam Wright

La solution simple et économique que j'utilise pour résoudre les problèmes d’analyse syntaxique REGEX et JSON consiste à créer un objet UIWebView et à injecter une ou plusieurs fonctions Javascript pour effectuer l’analyse syntaxique. La fonction javascript retourne ensuite une chaîne de la valeur (ou liste de valeurs) qui me tient à cœur. En fait, vous pouvez stocker un petit ensemble de bibliothèques de fonctions personnalisées pour des tâches particulières, puis les appeler au besoin.

Je ne sais pas si cette technique s'adapte à d'énormes quantités de requêtes d'analyse répétées, mais pour les opérations transactionnelles rapides, le travail est fait sans dépendre de ressources externes supplémentaires ou de code que vous ne comprenez peut-être pas.

8
Mark Caufman

NSRegularExpression est disponible depuis Mac OS X v10.7 et IOS 4.0.

6
bbaassssiiee

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 colloque IRC client car il a été mis à niveau 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).

6
Rob Keniger

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

4
newtonapple

Googling alittle, a trouvé cette bibliothèque: RegexOnNSString

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

-(NSString *) stringByReplacingRegexPattern:(NSString *)regex withString:(NSString *) replacement caseInsensitive:(BOOL)ignoreCase

et en utilisant NSRegularExpression class. Très facile à utiliser et pas besoin de s'inquiéter de rien.

Veuillez noter que NSRegularExpression est disponible depuis Mac OS X v10.7 et IOS 4.0, comme l'indique Datasmid.

4
nickeyzzz

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 à l'intérieur. Ensuite, je crée une méthode de classe statique dans la section "public:" pour une fonction C++ qui prend une chaîne NSString et renvoie une chaîne NSString (ou NSArray, si vous le souhaitez). J'ai ensuite converti NSString en C++ std :: string 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::string if the string is nil or empty.
// assume #include <string>
std::string s = "";
if (([sInput != nil]) && (!([sInput isEqualTo:@""]))) {
  std::string sTemp([sInput UTF8String]);
  s = sTemp;
}

À partir de là, je peux utiliser regex_replace comme ceci:

// assume #include <regex>
std::string sResult = std::regex_replace(sSource,sRegExp,sReplaceWith);

Ensuite, je peux reconvertir cette std :: string en NSString avec:

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

Si vous utilisez uniquement ce C++ uniquement pour cette fonction, vous pourrez alors appeler ce fichier extra.mm (nom de classe Extra), insérer cette méthode de classe statique, puis ajouter d'autres méthodes de classe statiques lorsque la situation se présentera. il est logique de le faire en C++, car dans certains cas, cela pose moins de problèmes. (Il existe des cas où ObjC utilise quelque chose avec moins de lignes de code et certains cas où C++ le fait avec moins de lignes de code.)

P.S. Encore une autre méthode consiste à utiliser un fichier .mm mais à créer un wrapper Objective C autour de l'utilisation de std :: string et de std :: regex_replace () (ou regex_match ()).

1
Volomike