6

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

黄油.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(匹配)

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

4

2 回答 2

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"; 

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

于 2012-12-19T08:35:49.097 回答
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)];
}
于 2012-12-19T08:44:10.433 回答