我需要NSRegularExpression结果字符串的长度

时间:2016-05-21 06:39:53

标签: objective-c regex string nsregularexpression

我有很多文件,其中一些文件的时间戳前缀如下:

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

我不知道如何自动确定这个长度。

有什么想法吗?

1 个答案:

答案 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'

这个想法有很多排列(在前缀之后允许可变数量的空格字符,也可以删除前导字符等),但希望这说明了使用捕获括号来查找文本的基本思想。问题,并使用|来匹配可能多个不同的前缀。