• Srt字幕文件解析


    //
    //  ViewController.m
    //  字幕解析
    //
    //  Created by admin on 2018/8/30.
    //  Copyright © 2018年 admin. All rights reserved.
    //
    
    #import "ViewController.h"
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        [self findMatch];
        
    }
    
    -(void)findMatch
    {
        /*
         444
         00:48:25,670 --> 00:48:26,920
         你就是死在那儿的
         
         */
        //当被检索的字符串太大时,用block控制查找
        NSString *srtText = [[NSString alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"mp4video" ofType:@"srt"] encoding:NSUTF8StringEncoding error:nil];
        NSString *searchText = [NSString stringWithFormat:@"
    %@",srtText];
        NSString *regexStr = @"[\n|\r\n|\r\t]{1}[0-9]{1,}[\n|\r\n|\r\t]{1}";//@"[\n|\r\n|\r\t]{1}[0-9]{2,}:[0-9]{2}:[0-9]{2},[0-9]{3} --> [0-9]{2,}:[0-9]{2}:[0-9]{2},[0-9]{3}" ;
        NSError *error;
        NSRegularExpression *regular = [NSRegularExpression  regularExpressionWithPattern:regexStr options:NSRegularExpressionCaseInsensitive error:&error];
        if (error) return;
        NSInteger __block startIndex = 0;
        NSInteger __block findCount = 0;
        [regular enumerateMatchesInString:searchText options:NSMatchingReportCompletion range:NSMakeRange(0, searchText.length) usingBlock:^(NSTextCheckingResult * _Nullable result, NSMatchingFlags flags, BOOL * _Nonnull stop) {
            NSRange matchRange = result.range;
            if (matchRange.length > 0 && findCount > 0) {
                NSString *noteText = [srtText substringWithRange:NSMakeRange(startIndex, matchRange.location - startIndex)];
                printf("*****************
    ");
                printf("%s
    ",[noteText UTF8String]);
                startIndex = matchRange.location;
                [self exportNote:noteText];
                printf("*****************
    ");
            }
            findCount ++;
        }];
    
    }
    
    -(void)exportNote:(NSString*)searchText
    {
        NSString *regexStr = @"[\n|\r\n|\r\t]{1}[0-9]{2,}:[0-9]{2}:[0-9]{2},[0-9]{3} --> [0-9]{2,}:[0-9]{2}:[0-9]{2},[0-9]{3}";
        NSError *error;
        NSRegularExpression *regular = [NSRegularExpression  regularExpressionWithPattern:regexStr options:NSRegularExpressionCaseInsensitive error:&error];
        if (error) return;
        [regular enumerateMatchesInString:searchText options:NSMatchingReportCompletion range:NSMakeRange(0, searchText.length) usingBlock:^(NSTextCheckingResult * _Nullable result, NSMatchingFlags flags, BOOL * _Nonnull stop) {
            NSRange matchRange = result.range;
            if (matchRange.length > 0) {
                printf("---------
    %s
    ",[[self textRemoveHeaderFooterWhiteLine:[searchText substringWithRange:NSMakeRange(0, matchRange.location)]] UTF8String]);
                printf("---------
    %s
    ",[[self textRemoveHeaderFooterWhiteLine:[searchText substringWithRange:NSMakeRange(matchRange.location,matchRange.length)]] UTF8String]);
                printf("---------
    %s
    ---------
    ",[[self exprotText:[self textRemoveHeaderFooterWhiteLine:[searchText substringFromIndex:matchRange.location+matchRange.length]]] UTF8String]);
                *stop = YES;
            }
        }];
    }
    
    -(NSString*)textRemoveHeaderFooterWhiteLine:(NSString*)contentText
    {
        NSInteger startIndex = 0;
        NSInteger endIndex = contentText.length - 1;
        NSString *subText = @"";
        while ((subText = [contentText substringWithRange:NSMakeRange(startIndex, 1)]) && ([subText isEqualToString:@"
    "] || [subText isEqualToString:@"
    "])) {
            startIndex++;
        }
        if (startIndex < endIndex) {
            while ((subText = [contentText substringWithRange:NSMakeRange(endIndex, 1)]) && ([subText isEqualToString:@"
    "] || [subText isEqualToString:@"
    "])) {
                endIndex--;
            }
        }
        if (startIndex <= endIndex) {
            return [contentText substringWithRange:NSMakeRange(startIndex, endIndex-startIndex+1)];
        }
        return @"";
    }
    
    -(NSString*)exprotText:(NSString*)text
    {
        NSInteger length = text.length;
        NSInteger beginIndex = [self contentIndexFor:text startIndex:0];
        if (beginIndex < length) {
            return [text substringFromIndex:beginIndex];
        }
        else {
            return @"";
        }
    }
    
    -(NSInteger)contentIndexFor:(NSString*)text startIndex:(NSInteger)startIndex
    {
        NSInteger length = text.length;
        if ((length - startIndex) > 2) {
            NSString *header = [text substringWithRange:NSMakeRange(startIndex, 2)];
            if ([header isEqualToString:@"{\"]) {
                NSInteger endIndex = startIndex + 2;
                while (endIndex < length && ![[text substringWithRange:NSMakeRange(endIndex, 1)] isEqualToString:@"}"]) {
                    endIndex++;
                }
                return [self contentIndexFor:text startIndex:endIndex+1];
            }
            else {
                return startIndex;
            }
        }
        else {
            return startIndex;
        }
    }
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    
    @end
  • 相关阅读:
    ubuntu
    什么是守护进程?
    Redis 简介
    什么是原子性,什么是原子性操作?
    什么是BSD协议?
    查看内存
    数据库备份与还原
    PostgreSQL 判断字符串包含的几种方法
    SQL 基础
    手风琴-过渡效果,显示隐藏列表案例
  • 原文地址:https://www.cnblogs.com/yuxiaoyiyou/p/9561501.html
Copyright © 2020-2023  润新知