首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带有regex捕获的NSPredicate总是得到0的结果。

带有regex捕获的NSPredicate总是得到0的结果。
EN

Stack Overflow用户
提问于 2017-07-25 09:01:36
回答 2查看 114关注 0票数 2

你好,所有的花,

我正在挠我的头,把一个regular expression放在一个NSPredicate里。

我希望将文档目录中的所有缩略图移到缓存目录中,并捕获它们--我已经创建了这个regex:_thumb(@[2-3]x)?\.jpg

请登录regex101.com您可以看到上面的regex处理这个测试数据:

代码语言:javascript
运行
复制
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

但是当我把它放入代码中时,它与任何东西都不匹配:

代码语言:javascript
运行
复制
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元素..。

我做错了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-25 09:13:55

使用MATCHES而不是ENDSWITH,因为MATCHES并不将表达式视为正则表达式,而是确保从字符串开始就匹配所有字符,因为MATCHES需要一个完整的字符串匹配,因此需要在_之前以某种方式匹配字符。

使用

代码语言:javascript
运行
复制
NSString *regex = @".*_thumb(@[23]x)?\\.jpg";

然后

代码语言:javascript
运行
复制
[NSPredicate predicateWithFormat: @"SELF MATCHES %@", regex]

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

请注意,如果您只想匹配23,最好编写[23],这里不需要-范围运算符。

您还可以将(@[23]x)?替换为(?:@[23]x)?,即将捕获组更改为非捕获,因为您似乎不需要以后可以访问子匹配。如果需要,则保留可选捕获组。

票数 2
EN

Stack Overflow用户

发布于 2017-07-25 09:19:02

问题在于ENDSWITH

代码语言:javascript
运行
复制
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

你需要的是

代码语言:javascript
运行
复制
NSString *regex = @".+_thumb(@[2-3]x)?\\.jpg";
NSPredicate *thumbPredicate = [NSPredicate predicateWithFormat: @"SELF MATCHES %@", regex];
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45298587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档