带有正则表达式捕获的 NSPredicate 总是得到 0 个结果

NSPredicate with regex capture always gets 0 results

大家好,

我正在为将 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 个元素...

我做错了什么?

使用 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 组。

问题出在 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];