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:
Est-ce vraiment vrai?
Vous plaisantez j'espère?
Ok, alors recommandez-vous une belle bibliothèque open-source?
Quels sont les moyens de s'approcher suffisamment sans importer une bibliothèque, peut-être avec la classe NSScanner?
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 .
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.)
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:
Vous pouvez utiliser la bibliothèque POSIX Regular Expressions (Yay pour un système d'exploitation compatible POSIX). Essayer
man 3 regex
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.
NSRegularExpression
est disponible depuis Mac OS X v10.7 et IOS 4.0.
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).
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.
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.
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 ()).