//
// 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. linux每日命令(35):grep命令

    Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expression Print,表示全局正则表达 ...

  2. 【Linux高级驱动】rtc驱动开发

    [1.分层思想] 1.1 rtc-dev.c   //设备接口层,功能:给用户提供接口 subsys_initcall(rtc_init);   , RTC_DEV_MAX, "rtc&qu ...

  3. 安装polyglot出错

    安装polyglot出错 错误 Complete output from command python setup.py egg_info: Traceback (most recent call l ...

  4. 【iCore4 双核心板_FPGA】例程八:乘法器实验——乘法器使用

    实验现象: 程序运行时,绿色led闪烁(目前,具体的乘法器调用请参考iCore3乘法器例程) 核心代码: module multiplier_ctrl( input clk_25m, input rs ...

  5. Serializable接口

    Serializable这个接口起啥作用呢?? 这个接口没有提供任何方法,我们实现它有什么意义呢? Serializable接口是启用其序列化功能的接口.Serializable接口中没有任何方法,一 ...

  6. Go Revel - Cache(缓存)

    revel在服务器端提供了`cache`库用以低延迟的存储临时数据.它缓存那些需要经常访问数据库但是变化不频繁的数据,也可以实现用户会话的存储. ##有效期 一下三种方法为缓存元素设置过期时间: 1. ...

  7. Java知多少(8)类库及其组织结构

    Java 官方为开发者提供了很多功能强大的类,这些类被分别放在各个包中,随JDK一起发布,称为Java类库或Java API. API(Application Programming Interfac ...

  8. Java知多少(47)多重catch语句的使用

    某些情况,由单个代码段可能引起多个异常.处理这种情况,你可以定义两个或更多的catch子句,每个子句捕获一种类型的异常.当异常被引发时,每一个catch子句被依次检查,第一个匹配异常类型的子句执行.当 ...

  9. Java 继承中构造方法的执行顺序问题

    在Java中,如果一个类没有任何显式创建的构造器则该类默认会有一个无参构造器:如果显式创建了有参构造器则该类就不再有默认无参构造器. 在Java继承中,构造器并不能被继承,而是被显示或隐式调用. 1. ...

  10. idea java 非web程序打包

    以下打包非常暴力.O(∩_∩)O哈哈~ 方法一: 第一步:选择需要打包的程序 第二步:选择需要打包的文件 第三步:artifacts->jar->from modules with... ...