[résolu: trop de fatigue] Ce sont mes yeux ou quoi ?
Céroce
Membre, Modérateur
J'ai écrit le programme suivant:
Une méthode de remplacement des tokens {jour} et {période}:
Voici le projet:
Une méthode de remplacement des tokens {jour} et {période}:
#import "TextReplacement.h"Et de quoi l'exercer:
@implementation TextReplacement
+ (NSString *) stringByReplacingTokensInString:(NSString *)sourceString {
NSMutableString *text = [NSMutableString stringWithString:sourceString];
const NSRange wholeTextRange = NSMakeRange(0, text.length);
NSString *dayString = @Aujourd'hui;
[text replaceOccurrencesOfString:@{jour} withString:dayString options:0 range:wholeTextRange];
NSString *periodString = @Matin;
[text replaceOccurrencesOfString:@{période} withString:periodString options:0 range:wholeTextRange];
return [text copy];
}
@end
#import <Foundation/Foundation.h>Je m'attends à ce que le remplacement fonctionne les deux fois, mais ça ne marche que dans le premier cas. Y comprenez-vous quelque chose ?!
#import "TextReplacement.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
// This one works
NSString *sourceString0 = @{période} {jour};
NSLog(@Before: %@ | after: %@", sourceString0, [TextReplacement stringByReplacingTokensInString:sourceString0]);
// But not this one
NSString *sourceString1 = @{jour} {période};
NSLog(@Before: %@ | after: %@", sourceString1, [TextReplacement stringByReplacingTokensInString:sourceString1]);
}
return 0;
}
Voici le projet:
Mots clés:
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
wholeTextRange, alors que le range risque de changer vu que tu fais du remplacement ?
Bon, ben ce sont mes yeux alors ! Merci beaucoup, dur dur de comprendre après une journée de codage ;-)
C'est corrigé du coup ? ie. range:wholeTextRange => range:[text length]
Je pense que c'était le soucis, vu que {jour} fait 6 et le texte qui le remplace fait 11 caractères de long (à une erreur près).
Du coup, on risque de sortir du range quand tu veux effectuer ton deuxième remplacement.
Ce qui dans le cas de {période} fonctionnait car le string de remplacement était plus court.
à‰dit: ça a été marqué en résolu entre temps.
Non, je n'utilise pas les regex, c'est lourd à utiliser, et toujours difficile à mettre au point. Les tokens ont ici une forme fixe, ma solution convient très bien, parce que je n'ai pas besoin de savoir où se trouvent les token et les interpréter; c'est un simple remplacement.
J'utilise les regex de manière temporaire pour faire des rechercher/remplacer évolué quand je transforme des données ou des sources (dans TextWrangler ou Visual Studio).
Je ne les utilise pas dans les sources car je suis incapable de les relire et encore moins de les corriger 6 mois après.
Il faut vraiment avoir des tests unitaires carrés pour cela.
Je ne les utilise pas en validation de saisie utilisateur car j'en fais peu et quand j'en fais, je traite les chaà®nes de manière artisanale.
Des regex seraient un peu overkill dans le cas simple avec des "placeholders" où un simple remplacement de texte fait l'affaire, non ?
Les regex c'est bien, mais c'est pas forcément évident.
Voici ma proposition comme alternative pour la méthode de Ceroce, méthode de catégorie sur NSString (car ça me parait plus intuitif, mais c'est affaire de goût) que j'ai fait plus générique en prenant un dictionnaire de remplacements en paramètre.
Exemple d'usage :
Et pour aider à comprendre une regexp, il y a ce site : http://regexper.com/
C'est justement ce qu'on reproche aux regex, non ? Il faut 1) les comprendre et 2) les tester.
Je précise que j'ai pas mal travaillé avec autrefois (un outil en Python pour faire des extractions dans du code source), et que je n'ai pas de problème avec le principe, mais je suis convaincu que si on peut s'en passer, il faut.