嗨所有的溢出者,
我在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个元素......
我做错了什么?
答案 0 :(得分:2)
使用MATCHES
而不是ENDSWITH
,因为 ENDSWITH
不会将表达式视为正则表达式 ,但要确保你也可以匹配字符串开头的所有字符,因为MATCHES
需要一个完整的字符串匹配,所以你需要在_
之前以某种方式匹配字符。
使用
NSString *regex = @".*_thumb(@[23]x)?\\.jpg";
然后
[NSPredicate predicateWithFormat: @"SELF MATCHES %@", regex]
.*
将匹配除换行符之外的任何0 +字符,尽可能多。
请注意,如果您只想匹配2
或3
,也可以写[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];