大家好,
我正在为将 正则表达式 放入 NSPredicate 中而摸不着头脑。
我想将我们所有的缩略图从 Documents 目录移动到 Caches 目录中并捕获所有我创建的正则表达式:_thumb(@[2-3]x)?\.jpg .
Here on regex101.com你可以看到上面的正则表达式处理这个测试数据:
grwior_thumb.jpg <- match
grwior.jpg
[email protected] <- match
vuoetrjrt.jpg
hafiruwhf_thumb.jpg <- match
[email protected] <- match
[email protected] <- 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 个元素...
我做错了什么?
Best Answer-推荐答案 strong>
使用 MATCHES 而不是 ENDSWITH ,因为 ENDSWITH 不会将表达式视为 正则表达式,但要确保匹配字符串开头的所有字符,因为 MATCHES 需要完整的字符串匹配,所以你需要以某种方式匹配 _ .
使用
NSString *regex = @".*_thumb(@[23]x)?\\.jpg";
然后
[NSPredicate predicateWithFormat: @"SELF MATCHES %@", regex]
.* 将尽可能多地匹配除换行符以外的任何 0+ 字符。
注意,如果你只想匹配2 或3 ,你不妨写[23] ,不需要a - 这里是范围操作符。
您也可以将 (@[23]x)? 替换为 (?[23]x)? ,即将捕获组更改为 non-capturing ,因为您似乎不需要稍后可以访问子匹配。如果这样做,请保留可选的 capturing 组。
关于ios - 带有正则表达式捕获的 NSPredicate 总是得到 0 个结果,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/45298587/
|