OGeek|极客世界-中国程序员成长平台

标题: ios - 带有正则表达式捕获的 NSPredicate 总是得到 0 个结果 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-12 13:36
标题: ios - 带有正则表达式捕获的 NSPredicate 总是得到 0 个结果

大家好,

我正在为将 正则表达式 放入 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-推荐答案


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

使用

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

然后

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

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

注意,如果你只想匹配23,你不妨写[23],不需要a - 这里是范围操作符。

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

关于ios - 带有正则表达式捕获的 NSPredicate 总是得到 0 个结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45298587/






欢迎光临 OGeek|极客世界-中国程序员成长平台 (http://ogeek.cn/) Powered by Discuz! X3.4