regexp

Anders

Membre confirmé
15 Mars 2003
12
0
Bonjour,

J'ai besoin de filtrer une String et de remplacer toutes les occurrences de certaines sous-chaînes par d'autres.

Comme je n'ai rien trouvé en Objective-C sur les expressions régulières (dans NSString ?) j'ai fait une classe Java.

J'ai installé l'API 1.4.1. (SDK et màj Java). J'utilise la fonction:
myString = myString.replaceAll("toto", "tata");

Le tout compile, mais lors du runtime :
java.lang.NoSuchMethodError

J'ai refait la même chose en Java pur en compilant avec Javac et là ça marche très bien. Quelqu'un a une idée ???

Je suspecte le Java bridge d'être incomplet, mais peut-être que c'est juste moi qui suis ignorant
smile.gif


Merci d'avance.

Anders
 
Va pas te compliquer la vie avec Java alors que l'Objective-C et les classes Cocoa t'offrent tout ce dont tu as besoin.
smile.gif


En effet tu ne trouveras pas la méthode que tu cherches dans NSString, ce qui est normal car les objets NSString ne sont pas modifiables, mais plutot dans NSMutableString qui permet les modifications avec dans ton cas la méthode :

replaceOccurrencesOfString:withString:options:range:

Avec ceci tu pourras remplacer tous tes "toto" par des "tata" et bien plus encore
wink.gif
 
OK pour une chaîne simple, mais comme j'ai besoin d'expressions plus complexes, il me faut la gestion des expressions régulières.

Je ferais bien que de l'Objective C, mais je ne trouve pas l'équivalent des stream tokenizer, des expressions régulières, la gestion correcte des exceptions, l'accès aux fichiers...

J'ai lu le bouquin d'Hillegass, fait les tutoriax sur Cocoadevcentral, lu les archives OmniGroup...

Je suis un peu déçu, je crois que je vais revenir à du Java pur..

Merci quand même

Anders.
 
<blockquote><font class="small">Post&eacute; &agrave; l'origine par Anders:</font><hr /> OK pour une chaîne simple, mais comme j'ai besoin d'expressions plus complexes, il me faut la gestion des expressions régulières.

Je ferais bien que de l'Objective C, mais je ne trouve pas l'équivalent des stream tokenizer, des expressions régulières, la gestion correcte des exceptions, l'accès aux fichiers...

J'ai lu le bouquin d'Hillegass, fait les tutoriax sur Cocoadevcentral, lu les archives OmniGroup...

Je suis un peu déçu, je crois que je vais revenir à du Java pur..

Merci quand même

Anders.


[/QUOTE]

pour les streams tokenizer, tu peux faire joujou avec NSScanner
ou utiliser componentsSeparatedByString qui appartient aux NString

fouilles un peu, tu devrais trouver des équivalents et souvent plus puissants, du moins plus rapides sur tous les tests que j'ai pu faire.
 
<blockquote><font class="small">Post&eacute; &agrave; l'origine par Anders:</font><hr /> Bonjour,

J'ai besoin de filtrer une String et de remplacer toutes les occurrences de certaines sous-chaînes par d'autres.

Comme je n'ai rien trouvé en Objective-C sur les expressions régulières (dans NSString ?) j'ai fait une classe Java.

J'ai installé l'API 1.4.1. (SDK et màj Java). J'utilise la fonction:
myString = myString.replaceAll("toto", "tata");

Le tout compile, mais lors du runtime :
java.lang.NoSuchMethodError

J'ai refait la même chose en Java pur en compilant avec Javac et là ça marche très bien. Quelqu'un a une idée ???

Je suspecte le Java bridge d'être incomplet, mais peut-être que c'est juste moi qui suis ignorant
smile.gif


Merci d'avance.

Anders


[/QUOTE]

pour continuer dans cette voie (on progresse toujours en essayant et trébuchant)
t'es sûr de bien appeller ta classe?
TaClasseJava = NSClassFromString(@"java.lang.String");
TonObjetJava = [[TaClasseJava alloc] init];
si ton replaceAll est dans java.lang.String, ce dont je ne suis pas sûr.


 
<blockquote><font class="small">Post&eacute; &agrave; l'origine par grenoble:</font><hr />
pour continuer dans cette voie (on progresse toujours en essayant et trébuchant)
t'es sûr de bien appeller ta classe?
TaClasseJava = NSClassFromString(@"java.lang.String");
TonObjetJava = [[TaClasseJava alloc] init];
si ton replaceAll est dans java.lang.String, ce dont je ne suis pas sûr.


[/QUOTE]

Merci pour les pistes de réflexion.
Pour ton dernier message je n'ai rien compris :-(
Pourquoi faire un alloc / init sur un objet Java ???

J'ai fait un controleur 100% java :
...
String result = textSource.string();
result = result.replaceAll("\\\\n\\\\n", "\n&lt;br /&gt;\n");
textView.insertText(result);
...

Merci encore

Anders

ps : oui replaceAll est dans java.lang.String
 
J'aimerais juste apporter une précision. replaceAll(...,...) existe en java 1.4 mais pas en 1.3. le fais que ça compile est déjà une bonne chose.

Lorsque tu compiles ton code avec Project Builder regarde dans l'onglet Target de ton projet puis dans la rubrique JAVA COMPILER SETTING pour savoir si ton TARGET VM Version est bien placé sur 1.4... si tu es sur une version antérieur c'est normal que la machine virtuelle ne trouve pas la fonction.

Je ne vois que cette solution pour que ça fonctionne.

 
<blockquote><font class="small">Post&eacute; &agrave; l'origine par Anders:</font><hr />

Merci pour les pistes de réflexion.
Pour ton dernier message je n'ai rien compris :-(
Pourquoi faire un alloc / init sur un objet Java ???

J'ai fait un controleur 100% java :
...
String result = textSource.string();
result = result.replaceAll("\\\\n\\\\n", "\n&lt;br /&gt;\n");
textView.insertText(result);
...

Merci encore

Anders

ps : oui replaceAll est dans java.lang.String


[/QUOTE]

tu parlais d'avoir utilisé le bridge java, alors je pensais que tu appelais ta classe java depuis ton code objective-c.

dans ce cas, tu dois charger ta classe Java dans un objet Obj-C avec l'instruction NSClassFromString pour pouvoir l'utiliser ensuite dans ton code Objective-C comme tout autre objet.

c'est ça, le java bridge.
sinon c'est du pure java
wink.gif


 
<blockquote><font class="small">Post&eacute; &agrave; l'origine par grenoble:</font><hr />
tu parlais d'avoir utilisé le bridge java, alors je pensais que tu appelais ta classe java depuis ton code objective-c.


[/QUOTE]

OK, je confonds tout
smile.gif

C'est plus clair maintenant et surtout CA MARCHE !!!

Je viens de découvrir (merci mitch) qu'il y a 2 endroits où l'on peut définir la Target VM :
- dans Compiler Settings (c'était OK, donc ça compilait)
- dans Info.plist Entries (il manquait ça, donc il ne trouvait pas la fonction)

un grand MERCI !

Si un jour j'arrive à faire une application digne de ce nom ce sera un peu grâce à vous
wink.gif

 
<blockquote><font class="small">Post&eacute; &agrave; l'origine par Anders:</font><hr />
Si un jour j'arrive à faire une application digne de ce nom ce sera un peu grâce à vous
wink.gif



[/QUOTE]

Non ça sera grace a toi..... puisque pour arriver au bout d'une application il faut surtout de la persévérence.

Et en fait c'est pour ca que les forums existent..... on est la pour partager et aussi pour apprendre les uns avec des autres.

Bon courage pour la suite de tes développements et si tu as d'autres questions n'hésite pas....