目标正则表达式evaluateWithObject不起作用

时间:2014-02-24 05:01:37

标签: iphone regex

当我尝试将字符串与正则表达式'^(34|37)'匹配时,即使给出了正确的字符串,它也不起作用。任何人都可以指出或指导我做错了吗? 这是我的代码:

NSPredicate *myTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", @"^(34|37)"];
if([myTest evaluateWithObject: @"378282246310005"]){
   NSLog(@"match");
}

3 个答案:

答案 0 :(得分:1)

你的正则表达式与给定的字符串不匹配。那是^(34|37)378282246310005不匹配。它匹配前两个字符,但之后失败,因为字符串包含更多字符,而正则表达式终止。

您需要更改正则表达式以匹配其余字符,即使您不想捕获它们。尝试将您的重复文本更改为^(34|37).*

答案 1 :(得分:0)

为什么不使用hasPrefix

if([@"378282246310005" hasPrefix:@"34"] || [@"378282246310005" hasPrefix:@"37"])
{
   NSLog(@"found it");
}

修改

使用NSPredicate

NSPredicate *myTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", @"^3(4|7)\\d+$"];

    if([myTest evaluateWithObject: @"378282246310005"])
    {
        NSLog(@"match");
    }
    else
    {
        NSLog(@"notmatch");
    }

使用NSRegularExpression

NSError *error = nil;
NSString *testStr = @"348282246310005";

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^3(4|7)" options:NSRegularExpressionCaseInsensitive error:&error];

NSInteger matches = [regex numberOfMatchesInString:testStr options:NSMatchingReportCompletion range:NSMakeRange(0, [testStr length])];

if(matches > 0 )//[myTest evaluateWithObject: @"378282246310005"])
{
    NSLog(@"match");
}
else
{
    NSLog(@"notmatch");
}

BTW:(34|37)看起来不是3437而是347337,因为引擎会选择4|3 43

答案 2 :(得分:0)

将正则表达式与bool类型匹配的单独方法。然后它会工作。

像这样

- (IBAction)tapValidatePhone:(id)sender
{
 if(![self validateMobileNo:self.txtPhoneNo.text] )
{
    NSLog(@"Mobile No. is not valid");
}
}

-(BOOL) validateMobileNo:(NSString *) paramMobleNo
 {
 NSString *phoneNoRegex = @"^(34|37)";
 NSPredicate *phoneNoTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",phoneNoRegex];
return [phoneNoTest evaluateWithObject:@"3435"];

}

它不会进入其他条件。