带有正则表达式捕获的 NSPredicate 总是得到 0 个结果
Posted
技术标签:
【中文标题】带有正则表达式捕获的 NSPredicate 总是得到 0 个结果【英文标题】:NSPredicate with regex capture always gets 0 results 【发布时间】:2017-07-25 09:01:36 【问题描述】:大家好,
我正在摸索将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 个元素...
我做错了什么?
【问题讨论】:
在模式的开头添加.*
,@".*_thumb(@[2-3]x)?\\.jpg"
。
还要注意ENDSWITH
只是不“支持”正则表达式模式。请参阅下面的扩展答案。
【参考方案1】:
使用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,因为您似乎不需要稍后可以访问子匹配。如果这样做,请保留可选的 capturing 组。
【讨论】:
查看 LIKE 和 MATCHES 字符串比较运算符 我假设其他人能够使用正则表达式并且只需要适当的转义。您永远不会停止学习...另外,感谢您使用非捕获组的建议。【参考方案2】:问题在于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];
【讨论】:
以上是关于带有正则表达式捕获的 NSPredicate 总是得到 0 个结果的主要内容,如果未能解决你的问题,请参考以下文章