带有正则表达式捕获的 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+ 字符。

请注意,如果您只想匹配23,不妨写[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 个结果的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式捕获带有类名的 html 元素

如何在正则表达式中使用带有字符的“环视”来捕获整个字符串?

创建一个带有换行符的 NSPredicate 作为字符串的一部分

NSPredicate 和正则表达式

NSPredicate 正则表达式错误

NSPredicate 与正则表达式检查字母数字