Problème avec MOKit
Tchouboudou
Membre
Bonsoir tout le monde.
J'utilise depuis très récemment MOKit. Je l'ai donc testé et essayé un peu. Malheuresement, j'ai un petit problème.
J'ai une chaà®ne : <gras>test</gras><gras>retest</gras>
Ma Regex est la suivante : [MORegularExpression regularExpressionWithString: @(<gras>(.+)</gras>)+ ignoreCase:YES];
Le problème, quand je récupère ce qu'il y a entre les balises, ça ne me donne pas 2 résultat, mais un seul : test</gras><gras>retest.
En PHP, il existe : 'U' pour éviter ça. Mais en "MOKit", comment fait-on ?
Merci d'avance,
Tchouboudou
J'utilise depuis très récemment MOKit. Je l'ai donc testé et essayé un peu. Malheuresement, j'ai un petit problème.
J'ai une chaà®ne : <gras>test</gras><gras>retest</gras>
Ma Regex est la suivante : [MORegularExpression regularExpressionWithString: @(<gras>(.+)</gras>)+ ignoreCase:YES];
Le problème, quand je récupère ce qu'il y a entre les balises, ça ne me donne pas 2 résultat, mais un seul : test</gras><gras>retest.
En PHP, il existe : 'U' pour éviter ça. Mais en "MOKit", comment fait-on ?
Merci d'avance,
Tchouboudou
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Il faut utiliser la notion d'expression "paresseuse", car une expression régulière est gourmande par défaut.
-> "(<gras>(.+?)</gras>)+"
Les quantificateurs gourmands sont {}, ?, *, +
Les quantificateurs paresseux qui correspondent sont {}?, ??, *?, +?
En gros c'est quoi MOKit ? Sur le site, il parle d'extension de Cocoa
MOKit is a Mac OS X framework that extends the Cocoa development frameworks. The project includes the framework itself as well as several supporting pieces that are all built by a single Project Builder project.
MOKit serves two main purposes.
First, MOKit is a useful collection of classes, categories, and functions that extend Apple's Cocoa frameworks. It may be used by other Cocoa projects by dragging the built framework into an existing project and choosing which targets should link with it.
Second, MOKit is maintained as an example of the best practices for structuring and deploying a useful third-party framework for Mac OS X. The Project Builder project has been carefully set up to do everything according to current best practices and should be updated quickly any time such best practices change.
Certaines wrappent des fonctions classiques telles les expressions régulières.
D'accord avec schlum pour l'inversion de la greedyness des quantificateurs, un "?" pour l'inverser.
Mais ce qui est étrange c'est qu'on ne puisse pas changer ces flags directement dans la classe MORegularExpression ???.
En PHP tu peux mettre ces flags (genre "U" pour "ungreedy", "non-gourmand") à la fin de ta RegEx car celle-ci est entourée de délimiteurs ; tu mets alors tes flags après le délimiteur fermant, genre "/maregex/U". Mais là tu ne spécifies que la regex, donc s'il y avait la possibilité de mettre des flags, ce serait dans un autre paramètre du selecteur... comme c'est le cas pour [tt]ignoreCase:[/tt] apparament
Je ne connais pas MOKit ni n'ait sa doc sous les yeux, mais n'y aurait-il donc pas une autre méthode qui, en plus de prendre la regex, permettrait de spécifier la greedyness (comme le "ignoreCase:" que tu as mis dans ton code ?) ou un setter genre "setGreedyness:(BOOL)isGreedy" pour spécifier le mode gourmand ou non ?
Ceci pour éviter de modifier la gourmandise des quantificateurs de manière unitaire sur chacun, mais le faire de manière globale... Maintenant j'imagine que si tu poses la question c'est que tu n'as pas trouvé dans la doc (mais je pose qd mm la question car tout le monde ne sait pas que cela s'appelle la "gourmandise" ou "greedyness" des quantificateurs, donc ça peut t'aider à chercher dans la doc), et s'il n'y a rien d'autre, la modification de chaque quatificateur (avec un "?" derrière comme t'a indiqué schlum) sera alors la seule solution
Je ne crois pas que les options de ces fonctions permettent de gérer la gourmandise globale de l'expression...
D'après le man, les options sont :
Et j'obtiens :
Il y a donc une balise en moins.
Donc, la solution proposé par Schlum, qui est de mettre une options, comment se fait-elle ?
Sinon, il y a un autre framework, OgreKit. Vous savez des choses dessus ?
Merci d'avance,
Tchouboudou
PS : j'ai pas trouvé de doc sur le site de MOKit...
En fait apparament il faut utiliser [tt]substringForSubexpressionAtIntex:idx[/tt] pour avoir le match n°idx (qui te renverra une substring vide s'il ne la trouve pas, si j'ai tout suivi).
Voir ici quelques détails
Quitte à faire un wrappeur, ils auraient pu faire qqch de plus simple
http://aarone.org/cocoaicu/
Hors-sujet :
Comment on télécharge en SVN :-\\
Sinon quand tu regardes l'adresses dans la commande, tu as souvent svn:// ou http:// comme service. Si c'est http://, tu peux aller dans le Finder -> Aller -> Se connecter au serveur et tu tapes là l'adresse.
Add the directory icu (included in the CocoaICU distribution) to the Header Search Path of your project.
Une question se pose dans ma tête : "Qu'est-ce c'est le Header Search Path ?"
*Vous m'excuserez de ne pas créer de nouveau sujet, c'est dans la continuité ::)*