匹配正则表达式与字符串(文件名)

时间:2012-12-19 08:21:55

标签: objective-c ios cocoa-touch

我正在尝试区分2个文件(NSString格式)。据我所知,这可以通过比较和匹配正则表达式来完成。我拥有的2个jpg文件的格式是:

butter.jpg

黄油1.JPG

我的问题是我可以编写正则表达式以匹配上面的2个字符串?我已经搜索并找到了一个示例表达式,但我不确定它是如何阅读并认为它是错误的。

这是我的代码:

NSString *exampleFileName = [NSString stringWithFormat:@"butter-1.jpg"];

NSString *regEx = @".*l{2,}.*";    

NSPredicate *regExTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regEx];

if ([regExTest evaluateWithObject:exampleFileName] == YES) {
    NSLog(@"Match!");
} else {
    NSLog(@"No match!");
}

修改

我尝试使用以下内容:

NSString *regEx = @"[a-z]+-[0-9]+.+jpg"; 

尝试匹配:

NSString *exampleFileName = [NSString stringWithFormat:@"abcdefg-112323.jpg"];

经过测试:

abc-11.jpg(匹配)

abcsdas-.jpg(不匹配)

abcdefg11。 (不匹配)

abcdefg-3123.jpg(匹配)

截至目前,它有效,但我想消除它可能没有的任何机会,任何输入?

2 个答案:

答案 0 :(得分:4)

NSString *regEx = @"[a-z]+-[0-9]+.+jpg"; 
对于butter.jpg

将失败,因为它需要有一个-且至少有一个{。<}

NSString *regEx = @"[a-z]+(-[0-9]+){0,1}.jpg"; 

如果你这样做

NSString *regEx = @"([a-z])+(?:-([0-9])+){0,1}.jpg"; 

您可以访问以后可能想要作为捕获组的信息。

  

(...)|捕获括号。匹配括号子表达式的输入范围在匹配后可用。

如果您不需要捕获组

NSString *regEx = @"(?:[a-z])+(?:-[0-9]+){0,1}.jpg"; 
  

(?:...)|非捕获括号。对包含的模式进行分组,但不提供匹配文本的捕获。比捕获括号更有效。

答案 1 :(得分:2)

您可以使用\p{L}匹配字母字符(使用任何语言)。您可以使用\d匹配数字。您需要转义.,因为在正则表达式中,.表示“任何字符”。

解析正则表达式很昂贵,所以你应该只做一次。

BOOL stringMatchesMyPattern(NSString *string) {
    static dispatch_once_t once;
    static NSRegularExpression *re;
    dispatch_once(&once, ^{
        re = [NSRegularExpression regularExpressionWithPattern:
            @"^\\p{L}+-\\d+\\.jpg$" options:0 error:NULL];
    }

    return nil != [re firstMatchInString:string options:0
        range:NSMakeRange(0, string.length)];
}