//
// 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:@"\n%@",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 = ;
NSInteger __block findCount = ;
[regular enumerateMatchesInString:searchText options:NSMatchingReportCompletion range:NSMakeRange(, searchText.length) usingBlock:^(NSTextCheckingResult * _Nullable result, NSMatchingFlags flags, BOOL * _Nonnull stop) {
NSRange matchRange = result.range;
if (matchRange.length > && findCount > ) {
NSString *noteText = [srtText substringWithRange:NSMakeRange(startIndex, matchRange.location - startIndex)];
printf("*****************\n");
printf("%s\n",[noteText UTF8String]);
startIndex = matchRange.location;
[self exportNote:noteText];
printf("*****************\n");
}
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(, searchText.length) usingBlock:^(NSTextCheckingResult * _Nullable result, NSMatchingFlags flags, BOOL * _Nonnull stop) {
NSRange matchRange = result.range;
if (matchRange.length > ) {
printf("---------\n%s\n",[[self textRemoveHeaderFooterWhiteLine:[searchText substringWithRange:NSMakeRange(, matchRange.location)]] UTF8String]);
printf("---------\n%s\n",[[self textRemoveHeaderFooterWhiteLine:[searchText substringWithRange:NSMakeRange(matchRange.location,matchRange.length)]] UTF8String]);
printf("---------\n%s\n---------\n",[[self exprotText:[self textRemoveHeaderFooterWhiteLine:[searchText substringFromIndex:matchRange.location+matchRange.length]]] UTF8String]);
*stop = YES;
}
}];
} -(NSString*)textRemoveHeaderFooterWhiteLine:(NSString*)contentText
{
NSInteger startIndex = ;
NSInteger endIndex = contentText.length - ;
NSString *subText = @"";
while ((subText = [contentText substringWithRange:NSMakeRange(startIndex, )]) && ([subText isEqualToString:@"\r"] || [subText isEqualToString:@"\n"])) {
startIndex++;
}
if (startIndex < endIndex) {
while ((subText = [contentText substringWithRange:NSMakeRange(endIndex, )]) && ([subText isEqualToString:@"\r"] || [subText isEqualToString:@"\n"])) {
endIndex--;
}
}
if (startIndex <= endIndex) {
return [contentText substringWithRange:NSMakeRange(startIndex, endIndex-startIndex+)];
}
return @"";
} -(NSString*)exprotText:(NSString*)text
{
NSInteger length = text.length;
NSInteger beginIndex = [self contentIndexFor:text startIndex:];
if (beginIndex < length) {
return [text substringFromIndex:beginIndex];
}
else {
return @"";
}
} -(NSInteger)contentIndexFor:(NSString*)text startIndex:(NSInteger)startIndex
{
NSInteger length = text.length;
if ((length - startIndex) > ) {
NSString *header = [text substringWithRange:NSMakeRange(startIndex, )];
if ([header isEqualToString:@"{\\"]) {
NSInteger endIndex = startIndex + ;
while (endIndex < length && ![[text substringWithRange:NSMakeRange(endIndex, )] isEqualToString:@"}"]) {
endIndex++;
}
return [self contentIndexFor:text startIndex:endIndex+];
}
else {
return startIndex;
}
}
else {
return startIndex;
}
} - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
} @end

Srt字幕文件解析的更多相关文章

  1. webvtt字幕转srt字幕的python程序(附改名程序)

    最近写了两个比较简单的python程序,原有都是由于看公开课感觉比较费劲,一个是下载的视频无用的名字太长,另一个就是下载的vtt字幕播放器不识别,写了一个vtt转换成str字幕格式的文件 vtt to ...

  2. 【Win 10 应用开发】加载外部的 srt 字幕

    据说系统内置的多媒体功能支持 srt. ssa 等字幕,老周测试过几种格式的字幕均能加载. SRT 字幕是最简单的字幕结构,甚至你用记事本都能做出来,就是分为几行来写. 第一行是字幕的编号,应该是从1 ...

  3. JWPlayer中字幕文件的配置

    最近应项目要求研究JWPlayer,视研究进度可能会将解决的问题或者一些配置方法写在这里. jwplayer支持vtt和srt格式的字幕文件,在视频中可以选择加载多个字幕文件(常用于多语言字幕),并且 ...

  4. SRT字幕格式

    [时间:2019-03] [状态:Open] [关键词:字幕,SRT,文件格式] 0 引言 视频文件中最简单.最常见的外挂字幕格式是SRT(SubRip Text).本人找了好久也没找到类似的标准文档 ...

  5. 用Python处理字幕文件

    始 下了部老电影,找到了相关的中英文字幕,奇怪的是,英文字幕能正常现实,中文字幕却不可以,我一度以为是Linux下播放器编码的问题,但是怎么更改设置都无效,而我以前在看其他电影时,中文字幕是正常的.所 ...

  6. 探究:Adobe Premiere Pro CC 2018 导入SRT字幕显示不全问题

    问题:如果使用PR,大概率会遇到导入SRT格式的字幕文件后,PR里面显示的字幕不完整,字幕丢失的问题. 探究:字幕文件的内容正常,导入PR后字幕出现丢失. 查看字幕文件,并测试,发现如下图,如果出现字 ...

  7. CocosStudio文件解析工具CsdAnalysis

    起因 因为工作需要,所以需要使用CocosStudio来制作界面动画什么的.做完了发现需要找里边对象的时候会有很长一串代码,感觉不是很爽.之前写OC代码的时候可以吧程序中的对象指针跟编辑器中的对象相对 ...

  8. 通过正则表达式实现简单xml文件解析

    这是我通过正则表达式实现的xml文件解析工具,有些XHTML文件中包含特殊符号,暂时还无法正常使用. 设计思路:常见的xml文件都是单根树结构,工具的目的是通过递归的方式将整个文档树装载进一个Node ...

  9. 八、Android学习第七天——XML文件解析方法(转)

    (转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 八.Android学习第七天——XML文件解析方法 XML文件:exten ...

随机推荐

  1. OpenCV 学习笔记 06 SIFT使用中出现版权问题error: (-213:The function/feature is not implemented)

    1 错误原因 1.1 报错全部信息: cv2.error: OpenCV(4.0.1) D:\Build\OpenCV\opencv_contrib-4.0.1\modules\xfeatures2d ...

  2. 全面理解Javascript闭包和闭包的几种写法及用途【转】

    一.什么是闭包和闭包的几种写法和用法 1.什么是闭包 闭包,官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.闭包的特点: 1. ...

  3. epoll的由来

    reference https://www.zhihu.com/question/20122137 感谢 @静海听风 @蓝形参 数据流有两个重要的参与者: 1.往流中写入数据者 2.从流中读取数据者 ...

  4. pandas DataFrame(1)

    之前介绍了numpy的二维数组,但是numpy二维数组有一些局限性,比如,它数组里所有的值的类型必须相同,不能某一列是数值型,某一列是字符串型,这样会导致无法使用 mean() , std() 等方法 ...

  5. GitHub私有代码库将免费开放

    1月8号消息,微软收购 GitHub 后,官方宣布了一项重大更新:免费开放私有代码库, 即 GitHub 用户现在可以免费创建无限量的私有存储库.同时还有另一项更新——GitHub Enterpris ...

  6. Tip 18 – How to decide on a lifetime for your ObjectContext

    Alex D James 7 May 2009 3:44 PM One of the most common questions we get is how long should an Object ...

  7. 三、主流区块链技术特点及Hyperledger Fabric V1.0版本特点

    一.Hyperledger fabric V1.0 架构 1.逻辑架构: 2.区块链网络 3.运行时架构 二.架构总结 1.架构要点 分拆Peer的功能,将Blockchain的数据维护和共识服务进行 ...

  8. jsoup访问页面: PKIX path building failed

    在用jsoup访问页面时报错javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX p ...

  9. Spark学习笔记——房屋价格预测

    先翻译了一下给的房屋数据的特征,这里定义了一个case class,方便理解每个特征的含义, Kaggle的房价数据集使用的是Ames Housing dataset,是美国爱荷华州的艾姆斯镇2006 ...

  10. 【Dubbo 源码解析】01_Dubbo 设计简介

    Dubbo 设计简介 Dubbo 采用 Microkernel + Plugin (微内核 + 插件)模式,Microkernel 只负责组装 Plugin,Dubbo 自身的功能也是通过扩展点实现的 ...