带有正则表达式捕获的 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+ 个字符,尽可能多。
注意,如果你只想匹配2
或3
,你不妨写[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];
大家好,
我正在为将 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+ 个字符,尽可能多。
注意,如果你只想匹配2
或3
,你不妨写[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];