我正在尝试区分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(匹配)
截至目前,它有效,但我想消除它可能没有的任何机会,任何输入?
答案 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)];
}