J'ai un textfield et je veux que le texte y soit entré dans un format: aa #### 1234 Je sais que cela devrait être fait dans la méthode shouldChangeCharactersInRange delegate de textfield. Nut Je ne suis pas en mesure de comprendre comment la condition sera mise en œuvre sur chaque caractère. Veuillez donner vos suggestions. Merci d'avance!

2
Prez 26 avril 2017 à 08:09

3 réponses

Meilleure réponse

Une expression qui peut être utile pour valider vos besoins peut être:

^[a-z]{2}\s\d{4}\s\d{4}$

Ici:

  • ^ - Affiche le début de la chaîne
  • [a-z]{2} - Affiche n'importe quel caractère entre a-z exactement 2 fois
  • \s - Affiche une fois le caractère d'espace blanc.
  • \d{4} - Affiche n'importe quel chiffre de 0 à 9, exactement 4 fois.
  • $ - Affiche la fin de la chaîne

Voici un exemple de solution de contournement, ici la partie délicate est d'autoriser la chaîne en construction:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSError *error = NULL;
    NSRegularExpression *regex = nil;

     NSMutableString *combinedText = [textField.text mutableCopy];
    [combinedText replaceCharactersInRange:range withString:string];

    switch (combinedText.length) {
        case 1:
        case 2:
            regex = [NSRegularExpression regularExpressionWithPattern:[NSString stringWithFormat:@"^[a-z]{%ld}", (long)combinedText.length] options:NSRegularExpressionCaseInsensitive error:&error];
            break;
        case 3:
            regex = [NSRegularExpression regularExpressionWithPattern:@"^[a-z]{2}\\s" options:NSRegularExpressionCaseInsensitive error:&error];
            break;
        case 4:
        case 5:
        case 6:
        case 7:
            regex = [NSRegularExpression regularExpressionWithPattern:[NSString stringWithFormat:@"^[a-z]{2}\\s\\d{%ld}", (long)combinedText.length - 3] options:NSRegularExpressionCaseInsensitive error:&error];
            break;
        case 8:
            regex = [NSRegularExpression regularExpressionWithPattern:@"^[a-z]{2}\\s\\d{4}\\s" options:NSRegularExpressionCaseInsensitive error:&error];
            break;
        case 9:
        case 10:
        case 11:
        case 12:
            regex = [NSRegularExpression regularExpressionWithPattern:[NSString stringWithFormat:@"^[a-z]{2}\\s\\d{4}\\s\\d{%ld}$", (long)combinedText.length - 8] options:NSRegularExpressionCaseInsensitive error:&error];
            break;
        default:
            return false;
    }

    if(error) return false;        

    NSUInteger numberOfMatches = [regex numberOfMatchesInString:combinedText options:0 range:NSMakeRange(0, combinedText.length)];
    return numberOfMatches > 0 || string.length == 0;
}

J'espère que cela pourra aider!

0
NeverHopeless 26 avril 2017 à 07:00

Essayez ceci

-(BOOL)checkString:(NSString *)str{
    NSString *regex1 = @"^[a-bA-B0-9]"; // chabge regex as per your needs
    NSPredicate *test1 = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex1];
    return [test1 evaluateWithObject:str] ;
}
0
KKRocks 26 avril 2017 à 05:45

Créez des catégories sur UITextField et ajoutez cette condition d'écriture de méthode en fonction de vos besoins. Exemple ci-dessous pour l'identifiant de messagerie:

 - (BOOL)validateRegEx:(NSString*)regexString
 {
     NSError *error = NULL;
     NSRegularExpression *regex = [NSRegularExpression    regularExpressionWithPattern:regexString
                                                                      options:NSRegularExpressionCaseInsensitive
                                                                         error:&error];
     NSUInteger numberOfMatches = [regex numberOfMatchesInString:self.text
                                                    options:0
                                                      range:NSMakeRange(0, [self.text length])];

    return numberOfMatches > 0;
}
0
rmaddy 26 avril 2017 à 05:23