我有很多文件,其中一些文件的时间戳前缀如下:
1 20160308 1340 - All-of-me_key.pdf
2 2016 05 15 00 45 - nobody-knows-you-when-you-are-down-and-out.pdf
其他人没有前缀:
- praying-for-time_key.pdf
- purple rain.pdf
- rehab.pdf
前缀的格式各不相同。如上所述,有些人有空白作为分隔符,有些人有破折号。
我想自动执行一个过程,从相关的文件名中删除前缀。
出于解释的目的,我创建了两个正则表达式模式:
atRegexArray = [NSArray arrayWithObjects:
@"[0-9]{8} +[0-9]{4} - ",
@"[0-9]{4} +[0-9]{2} +[0-9]{2} +[0-9]{2} +[0-9]{2} - ", nil ] ;
第一个检测第一类型的前缀,第二个模式检测第二类型的前缀。
第一种类型检测的示例:
NSString * patternString = @"[0-9]{8} +[0-9]{4} - " ;
NSString *)theFileName = @"20160308 1340 - All-of-me_key.pdf" ;
NSString *string = theFileName;
NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:patternString
options:NSRegularExpressionCaseInsensitive
error:&error];
NSUInteger numberOfMatches = [regex numberOfMatchesInString:theFileName
options:0
range:NSMakeRange(0, [theFileName length])];
检测工作正常。问题是,我需要前缀的长度。 在该示例中,“20160308 1340 - ”的长度是16 在示例2中,“2016 05 15 00 45 - ”的长度是19
我不知道如何自动确定这个长度。
有什么想法吗?
答案 0 :(得分:1)
如果您真的只想在前缀后面添加字符串,则可以使用捕获括号。如果您想匹配多个特定数字模式,那么只需包含由|
分隔的不同模式。例如:
NSArray *strings = @[@"20160308 1340 - All-of-me_key.pdf",
@"2016 05 15 00 45 - nobody-knows-you-when-you-are-down-and-out.pdf",
@"- praying-for-time_key.pdf"];
NSString *patternString = @"^(\\d{8} \\d{4} |\\d{4} \\d{2} \\d{2} \\d{2} \\d{2} )?(.*)$";
NSError *error;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:patternString
options:0
error:&error];
for (NSString *string in strings) {
NSTextCheckingResult *match = [regex firstMatchInString:string options:0 range:NSMakeRange(0, string.length)];
if (match) {
NSLog(@"length of prefix = %ld", (long)[match rangeAtIndex:1].length);
NSLog(@"stringAfterPrefix = '%@'", [string substringWithRange:[match rangeAtIndex:2]]);
}
}
结果是:
length of prefix = 14 stringAfterPrefix = '- All-of-me_key.pdf' length of prefix = 17 stringAfterPrefix = '- nobody-knows-you-when-you-are-down-and-out.pdf' length of prefix = 0 stringAfterPrefix = '- praying-for-time_key.pdf'
这个想法有很多排列(在前缀之后允许可变数量的空格字符,也可以删除前导字符等),但希望这说明了使用捕获括号来查找文本的基本思想。问题,并使用|
来匹配可能多个不同的前缀。