使用正则表达式捕获的NSPredicate总是得到0结果

时间:2017-07-25 09:01:36

标签: ios objective-c regex nspredicate nsfilemanager

嗨所有的溢出者,

我在regular expression内放置NSPredicate时感到头疼。

我想将所有缩略图从Documents目录移动到Caches目录,并抓住他们所有我创建此正则表达式:_thumb(@[2-3]x)?\.jpg

Here on regex101.com您可以看到上述正则表达式使用此测试数据:

grwior_thumb.jpg          <- match
grwior.jpg
vuoetrjrt_thumb@2x.jpg    <- match
vuoetrjrt.jpg
hafiruwhf_thumb.jpg       <- match
hafiruwhf_thumb@2x.jpg    <- match
hafiruwhf_thumb@3x.jpg    <- match
hafiruwhf.jpg

但是当我把它放在代码中时它没有匹配任何东西:

NSError *error = nil;
NSFileManager *fileManager = [NSFileManager defaultManager];

// Find and move thumbs to the caches folder
NSArray<NSString *> *mediaFilesArray = [fileManager contentsOfDirectoryAtPath:documentsPath error:&error];

NSString *regex = @"_thumb(@[2-3]x)?\\.jpg";
NSPredicate *thumbPredicate = [NSPredicate predicateWithFormat: @"SELF ENDSWITH %@", regex];

NSArray<NSString *> *thumbFileArray = [mediaFilesArray filteredArrayUsingPredicate:thumbPredicate];

thumbFileArray总是有0个元素......

我做错了什么?

2 个答案:

答案 0 :(得分:2)

使用MATCHES而不是ENDSWITH,因为 ENDSWITH不会将表达式视为正则表达式 ,但要确保你也可以匹配字符串开头的所有字符,因为MATCHES需要一个完整的字符串匹配,所以你需要在_之前以某种方式匹配字符。

使用

NSString *regex = @".*_thumb(@[23]x)?\\.jpg";

然后

[NSPredicate predicateWithFormat: @"SELF MATCHES %@", regex]

.*将匹配除换行符之外的任何0 +字符,尽可能多。

请注意,如果您只想匹配23,也可以写[23],此处不需要-范围运算符。

您也可以将(@[23]x)?替换为(?:@[23]x)?,即将捕获组更改为non-capturing,因为您似乎不需要稍后访问子匹配。如果您这样做,请保留可选的捕获组。

答案 1 :(得分:1)

问题在于ENDSWITH

ENDSWITH
The left-hand expression ends with the right-hand expression.
MATCHES
The left hand expression equals the right hand expression using a regex-style comparison according to ICU v3

您需要的是

NSString *regex = @".+_thumb(@[2-3]x)?\\.jpg";
NSPredicate *thumbPredicate = [NSPredicate predicateWithFormat: @"SELF MATCHES %@", regex];