使用正则表达式输入掩码文本字段

时间:2014-03-29 00:01:47

标签: ios regex

我尝试为UITextField创建一个输入掩码,用于输入飞机呼号。面具应该是" F - "和4个字母。我用正则表达式尝试它,但它没有正常工作。我告诉你我的代码。用它输入任何角色是不可能的。

if (textField==_tImmat) {
    NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
    NSString *expression = @"^(F-)([A-Z]{4})$";
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:expression options:NSRegularExpressionCaseInsensitive error:nil];
    NSUInteger numberOfMatches = [regex numberOfMatchesInString:newString options:0 range:NSMakeRange(0, [newString length])];
    if (numberOfMatches == 0){
        return NO;
    }

创建正则表达式的任何想法都适用于像这样的字符串值:" F-XXXX"其中X是大写字母? 谢谢你的帮助...

2 个答案:

答案 0 :(得分:0)

您的验证仅接受值F-XXXX。如果用户输入F,则以黑色文本字段开头,验证失败,因为它不是F-XXXX

如果输入的文本不可能与模式匹配,则需要让用户输入每个字符并且仅验证失败。

没有理由为此使用正则表达式。只需扫描newString即可。确保它以F开头。如果长度为2或更长,请检查第二个字符是否为“`”。然后只需确保长度小于6,最后几个字符是字母A-Z。

答案 1 :(得分:0)

我猜你的代码在你的shouldChangeCharactersInRange方法中?

如果是这样,因为您要使用这种特定格式,所以不能输入其他字符串,即除非newString的值为F-< 4 LETTERS>,否则该方法将返回NO。

因此,您可以将验证移至textFieldShouldReturn方法:

-(BOOL)textFieldShouldReturn:(UITextField *)textField
{
    NSString *expression = @"^(F-)([A-Z]{4})$";
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:expression options:NSRegularExpressionCaseInsensitive error:nil];
    NSUInteger numberOfMatches = [regex numberOfMatchesInString:textField.text options:0 range:NSMakeRange(0, [textField.text length])];

    if (numberOfMatches == 0)
    {
        NSLog(@"wrong format!");
    }
    else
    {
        NSLog(@"correct format!");
    }

    return NO;
}

(顺便说一句,对于使用NSRegularExpressionCaseInsensitive的选项,这意味着它允许用户输入大写和小写字符并验证它们是否正确)

如果您想验证用户输入和限制输入非法字符,我会将您的代码更改为以下内容:

NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];

switch (newString.length)
{
    case 0:
        //allow user empty string
        return YES;
    case 1:
        //check that first character is F
        return [newString isEqualToString:@"F"];
    case 2:
        //check that the second character is -
        return [newString isEqualToString:@"F-"];
    case 3 ... 6:
        //this will check the last four characters based on your regex
    {
        NSString *expression = @"^(F-)([A-Z]{0,4})$"; //notice the added range
        NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:expression options:NSRegularExpressionCaseInsensitive error:nil];
        NSUInteger numberOfMatches = [regex numberOfMatchesInString:newString options:0 range:NSMakeRange(0, [newString length])];
        if (numberOfMatches == 0)
        {
            return NO;
        }
        else
        {
            return YES;
        }
    }
    default:
        //in all other cases validation will fail
        return NO;
}