2015-12-16 1 views
2

Je suis assez nouveau à l'utilisation regex dans iOS, et j'expérimente avec elle. J'ai du mal à trouver une solution au problème que j'ai. Je m'excuse à l'avance si cela a déjà été répondu ou si je manque quelque chose de vraiment évident et/ou si j'utilise le mauvais outil pour atteindre mon objectif. J'ai une chaîne que l'utilisateur va entrer dans un textfield. Comment puis-je changer cela pour corriger l'orthographe d'un mot contenu dans la chaîne?Remplacer le texte avec plusieurs expressions régulières sur iOS

NSString *userstring = @"Jon Travalta"; 
NSError *error = NULL; 
NSString *modstring = @""; 

NSRegularExpression *regex = [[NSRegularExpression alloc]init]; 
regex = [NSRegularExpression regularExpressionWithPattern:@"(Jon|Johnathan|Jonathen|John)\\s(Travalta|Travalte|Travelta|Travolta)" options:NSRegularExpressionCaseInsensitive error:&error]; 

modstring = [regex stringByReplacingMatchesInString:userstring options:0 range:NSMakeRange(0,[userstring length]) withTemplate:@"John Travolta"]; 

Cela fonctionne et corrige la chaîne bien, mais disons que la chaîne est quelque chose d'autre. Je veux garder cette regex active pour vérifier la chaîne si elle contient l'un de ces éléments pour la corriger. Donc, disons que la chaîne est réglée, avant la vérification ci-dessus, sur "Anthony Hopkin". Je voudrais également utiliser un autre regexwithpattern pour vérifier la chaîne pour corriger celle avec l'orthographe correcte du nom.

regex = [NSRegularExpression regularExpressionWithPattern:@"(Anthony|Antony|Tony|)\\s(Hopkin|Hapkin|Hopkins)" options:NSRegularExpressionCaseInsensitive error:&error]; 

modstring = [regex stringByReplacingMatchesInString:userstring options:0 range:NSMakeRange(0,[userstring length]) withTemplate:@"Anthony Hopkins"]; 

Ceci remplacera la chaîne avec Anthony Hopkins, même s'il s'agit de la première chaîne.

Si je fais une allocation différente de NSRegularExpression et différent stringByReplacingMatchesInString, il ne fait rien et la chaîne reste ce qu'elle était pour commencer.

+0

La réponse est qu'il peut, en les combinant en 1. Cependant, le remplacement devrait savoir lequel correspondait. Cela nécessiterait une chaîne dynamique par opposition à une chaîne statique. – sln

+0

@sln je suis d'accord une seule expression est probablement la façon dont je vais aller avec elle, mais comment puis-je utiliser une chaîne dynamique pour vérifier lequel correspond à choisir quel remplacement serait appelé. Pourriez-vous me donner un exemple s'il vous plaît? Je serais très reconnaissant – Ac128

+0

le moyen le plus simple d'éliminer les fautes de frappe génère des valeurs _soundex_, il pourrait fonctionner dans votre cas aussi bien sur. – holex

Répondre

2

Les expressions régulières ne sont pas le bon outil pour la vérification orthographique.

Dans votre question, vous souhaitez effectuer plusieurs remplacements en fonction d'expressions régulières. Pour plus de clarté, je vais simplement parcourir votre liste de corrections possibles en les appliquant une à la fois. Demandez-vous si une seule expression peut correspondre à tous les noms possibles.

-(NSString*) naiiveSpellCheckString:(NSString*) s { 

    NSDictionary* corrections = @{ 
           @"Travolta": @"Travalta|Travalte|Travelta|Travolta", 
           @"John": @"Jon|Johnathan|Jonathen", 
           @"Anthony":@"Anthoni|Antony|Tony", 
           @"Hopkins": @"Hopkin|Hapkin", 
           }; 

    for (NSString* key in corrections.keyEnumerator) { 

     NSError* error; 
     NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:[corrections objectForKey:key] 
            options:NSRegularExpressionCaseInsensitive 
            error:&error]; 

     NSAssert1(!error, @"Error parsing regex %@", [corrections objectForKey:key]); 

     s = [regex stringByReplacingMatchesInString:s 
              options:0 
              range:NSMakeRange(0, s.length) withTemplate:key]; 

    } 

    return s; 
} 
+0

Merci! Fonctionne comme un régal. Exactement ce que je voulais. Apprécié – Ac128