你好,所有的花,
我正在挠我的头,把一个regular expression
放在一个NSPredicate
里。
我希望将文档目录中的所有缩略图移到缓存目录中,并捕获它们--我已经创建了这个regex:_thumb(@[2-3]x)?\.jpg
。
请登录regex101.com您可以看到上面的regex处理这个测试数据:
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元素..。
我做错了什么?
发布于 2017-07-25 09:13:55
使用MATCHES
而不是ENDSWITH
,因为MATCHES
并不将表达式视为正则表达式,而是确保从字符串开始就匹配所有字符,因为MATCHES
需要一个完整的字符串匹配,因此需要在_
之前以某种方式匹配字符。
使用
NSString *regex = @".*_thumb(@[23]x)?\\.jpg";
然后
[NSPredicate predicateWithFormat: @"SELF MATCHES %@", regex]
.*
将匹配除行中断字符以外的任何0+字符,尽可能多。
请注意,如果您只想匹配2
或3
,最好编写[23]
,这里不需要-
范围运算符。
您还可以将(@[23]x)?
替换为(?:@[23]x)?
,即将捕获组更改为非捕获,因为您似乎不需要以后可以访问子匹配。如果需要,则保留可选捕获组。
发布于 2017-07-25 09:19:02
问题在于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];
https://stackoverflow.com/questions/45298587
复制相似问题