快速简易封装歌词文件

月半夜小夜曲.lrc

[ti:月半夜小夜曲]
[ar:李克勤]
[by:TTPod]
[00:01.48]月半小夜曲
[00:05.66]作词:向雪怀
[00:10.66]作曲:河合奈保子
[00:15.63]演唱:李克勤
[00:20.63]
[00:24.56]仍然倚在失眠夜望天边星宿
[00:30.46]仍然听见小提琴如泣似诉再挑逗
[00:36.30]为何只剩一弯月留在我的天空
[00:42.92]这晚以后音讯隔绝
[00:48.29]人如天上的明月是不可拥有
[00:54.26]情如曲过只遗留无可挽救再分别
[01:00.15]为何只是失望填密我的空虚
[01:06.82]这晚夜没有吻别
[01:12.23]仍在说永久想不到是借口
[01:18.40]从未意会要分手
[01:27.42]但我的心每分每刻仍然被她占有
[01:34.25]她似这月儿仍然是不开口
[01:39.12]提琴独奏独奏着明月半倚深秋
[01:45.52]我的牵挂我的渴望  直至以后
[01:51.70]
[02:21.15]仍然倚在失眠夜望天边星宿
[02:27.06]仍然听见小提琴如泣似诉再挑逗
[02:32.97]为何只剩一弯月留在我的天空
[02:39.59]这晚以后音讯隔绝
[02:45.02]人如天上的明月是不可拥有
[02:51.08]情如曲过只遗留无可挽救再分别
[02:56.92]为何只是失望填密我的空虚
[03:03.63]这晚夜没有吻别
[03:08.75]仍在说永久想不到是借口
[03:15.23]从未意会要分手
[03:23.95]但我的心每分每刻仍然被她占有
[03:30.60]她似这月儿仍然是不开口
[03:35.79]提琴独奏独奏着明月半倚深秋
[03:42.26]我的牵挂我的渴望  直至以后
[03:47.86]仍在说永久想不到是借口
[03:54.09]从未意会要分手
[04:02.76]但我的心每分每刻仍然被她占有
[04:09.88]她似这月儿仍然是不开口
[04:14.85]提琴独奏独奏着明月半倚深秋
[04:21.25]我的牵挂我的渴望  直至以后
[04:29.00]
[00:00.001]>>>>>>>>>>>>>!
[00:00.009]
[99:00.000]

分解不用正则表达式,而用for循环折腾你就out了.block遍历以及forin方式都是设计模式中的迭代器模式,效率要比for循环高哦.

YYRegex.h + YYRegex.m

//
//  YYRegex.h
//  AnalysizeSongFile
//
//  Created by yuanyuan on 27/6/14.
//  Copyright (c) 2014年 yuanyuan. All rights reserved.
//

#import <Foundation/Foundation.h>

typedef void(^textCheckingResult)(NSTextCheckingResult *match,NSRange matchRang);

@interface YYRegex : NSObject

#pragma mark -可读属性
@property (nonatomic,strong)NSString *regexString; //正则字符串
@property (nonatomic,strong)NSString *sourceString; //数据源字符串

#pragma mark -只读属性
@property (nonatomic,readonly)NSUInteger numberMatches; //数量的匹配

#pragma mark -类方法
+ (void)string:(NSString *)string pattern:(NSString *)pattern each:(textCheckingResult)block;

+ (NSString *)string:(NSString *)string pattern:(NSString *)pattern replaceTemplate:(NSString *)string;

#pragma mark -实例方法
- (instancetype)initWithSourceString:(NSString *)sourceString regexString:(NSString *)regexString;
- (void)startAnalyse;
- (void)each:(textCheckingResult)block;
- (NSString *)replaceWithTemplateString:(NSString *)string;

@end
//
//  YYRegex.m
//  AnalysizeSongFile
//
//  Created by yuanyuan on 27/6/14.
//  Copyright (c) 2014年 yuanyuan. All rights reserved.
//

#import "YYRegex.h"

@interface YYRegex ()

@property (nonatomic,strong)NSArray *resultArray;
@property (nonatomic,strong)NSRegularExpression *regex;

@end
@implementation YYRegex

- (instancetype)init
{
    return [self initWithSourceString:nil regexString:nil];
}

- (instancetype)initWithSourceString:(NSString *)sourceString regexString:(NSString *)regexString
{
    self = [super init];
    if (self) {
        _sourceString = sourceString;
        _regexString = regexString;
    }
    return self;
}

- (void)startAnalyse
{
    if ([_sourceString length] && [_regexString length])
    {
        // 正则表达式
        _regex =         [NSRegularExpression regularExpressionWithPattern:_regexString
                                                  options:NSRegularExpressionCaseInsensitive
                                                    error:nil];

        // 执行相关匹配操作
        NSRange range = NSMakeRange(0, [_sourceString length]);
        _resultArray = [_regex matchesInString:_sourceString
                                       options:0
                                         range:range];

        // 获取到个数
        _numberMatches = [_resultArray count];
    }
    else
    {
        NSLog(@"亲,请设置需要分析的字符串以及正则表达式");
    }
}

- (void)each:(textCheckingResult)block
{
    if (_resultArray)
    {
        for (NSTextCheckingResult *match in _resultArray)
        {
            block(match, [match range]);
        }
    }
}

- (NSString *)replaceWithTemplateString:(NSString *)string
{
    if (string)
    {
        return [_regex stringByReplacingMatchesInString:_sourceString
                                                options:0
                                                  range:NSMakeRange(0, [_sourceString length])
                                           withTemplate:string];
    }
    else
    {
        return nil;
    }
}

+ (void)string:(NSString *)string pattern:(NSString *)pattern each:(textCheckingResult)block
{
    if ([string length] && [pattern length])
    {
        // 正则表达式
        NSRegularExpression *regex =         [NSRegularExpression regularExpressionWithPattern:pattern
                                                  options:NSRegularExpressionCaseInsensitive
                                                    error:nil];

        // 执行相关匹配操作
        NSRange range = NSMakeRange(0, [string length]);
        NSArray *matches = [regex matchesInString:string
                                          options:0
                                            range:range];

        // 匹配好了
        for (NSTextCheckingResult *match in matches)
        {
            block(match, [match range]);
        }
    }
}

+ (NSString *)string:(NSString *)string
             pattern:(NSString *)pattern
     replaceTemplate:(NSString *)templateString
{
    if ([string length] && [pattern length])
    {
        // 正则表达式
        NSRegularExpression *regex =         [NSRegularExpression regularExpressionWithPattern:pattern
                                                  options:NSRegularExpressionCaseInsensitive
                                                    error:nil];

        return [regex stringByReplacingMatchesInString:string
                                               options:0
                                                 range:NSMakeRange(0, [string length])
                                          withTemplate:templateString];
    }
    else
    {
        return nil;
    }
}

@end

打印信息如下:

使用相关的controller读取歌词的代码如下:

 //读取歌词
    NSString *str = [NSString stringWithContentsOfFile:BUNDLE_PATH(@"月半小夜曲.lrc") encoding:NSUTF8StringEncoding error:nil];

    NSLog(@"%@",str);

    //将歌词根据换行符分割成数组
    NSArray *strArray = [str componentsSeparatedByString:@"\n"];

    //分解歌词
    [strArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

        //初始化一个可变字符串
        __block NSMutableString *tmpStr = [[NSMutableString alloc] initWithString:obj];

        //正则表达式匹配出【**:**.**】的位置
        [YYRegex string:tmpStr
                pattern:@"\\[..:..\\...\\]"
                   each:^(NSTextCheckingResult *match, NSRange matchRang) {

                       //获取时间轴
                       NSString *time = [tmpStr substringWithRange:matchRang];

                       //获取歌词文本
                       [tmpStr replaceCharactersInRange:matchRang withString:@""];

                       //打印相关信息
                       NSLog(@"%@ -- > %@",time,tmpStr);

                   }];
    }];

快速简易封装歌词文件

时间: 2024-10-11 11:51:39

快速简易封装歌词文件的相关文章

快速简易的分解歌词文件

以下是一个歌词文件,如何快速的分解出来呢? 李克勤 - 月半夜小夜曲.lrc [ti:月半夜小夜曲] [ar:李克勤] [by:TTPod] [00:01.48]月半小夜曲 [00:05.66]作词:向雪怀 [00:10.66]作曲:河合奈保子 [00:15.63]演唱:李克勤 [00:20.63] [00:24.56]仍然倚在失眠夜望天边星宿 [00:30.46]仍然听见小提琴如泣似诉再挑逗 [00:36.30]为何只剩一弯月留在我的天空 [00:42.92]这晚以后音讯隔绝 [00:48.2

对JdbcTemplate进行简易封装以使其更加易用

在上一篇博文<基于SpringJDBC的类mybatis形式SQL语句管理的思考与实现>中,我们实现了采用XML文件对SQL进行管理.在本篇博文中,我们将对SpringJDBC提供的JdbcTemplate进行简易封装,使其更加的易用,更加贴近上篇博文中对于SQL管理的设计. 我们希望在使用将要封装的这个工具进行数据库操作时有以下几个优势: 不处理数据获取异常 不关心日志记录 即可以使用我们XML文件中的SQL语句,也可以使用在业务方法中定义的SQL语句.(因为我们设计的XML文件并不能够非常

C#下载歌词文件

前段时间写了一篇c#解析Lrc歌词文件,对lrc文件进行解析,支持多个时间段合并.本文借下载歌词文件来探讨一下同步和异步方法. Lrc文件在网络上随处可见,我们可以通过一些方法获取,最简单的就是别人的接口,如: http://geci.me/api/lyric/不得不爱 返回下面的json,这样我们就很容易得到歌词文件了. { "count": 2, "code": 0, "result": [ { "aid": 272779

第一百六十一节,封装库--JavaScript,完整封装库文件

封装库--JavaScript,完整封装库文件 /** *feng_zhuang_ku_1.0版本,js封装库,2016/12/29日:林贵秀 **/ /** 前台调用 * 每次调用$()创建库对象,使其每次调用都是独立的对象 * $()创建库对象,有一个可选参数,参数有两种方式,1是传入的this,2是传入的字符串 * 可选参数说明: * 传入的this,this,就是当前对象本身 * * 传入的字符串,代表获取元素选择器 * 参数是元素选择器(id值.class值.标签名称)其中一样的字符串

Java使用正则表达式解析LRC歌词文件

LRC歌词是一种应用广泛的歌词文件,对其进行解析时 标准格式: [分钟:秒.毫秒] 歌词 1 import java.io.BufferedReader; 2 import java.io.File; 3 import java.io.FileInputStream; 4 import java.io.InputStreamReader; 5 import java.util.ArrayList; 6 import java.util.HashMap; 7 import java.util.Li

c++下lrc歌词文件检索(自己写的检索歌词文件,记录点滴)

贴上一个文档,是写这个程序的基本的思路,当然具体的程序和这个有一些出入,但是大体上一样.求批评指正. /*目标:在一个文件夹下吧所有的lrc歌词文件用程序导入,进行分析,最后的结果用TXT表示出来.*/ /*分析:只要建立了倒排索引就可以很容易把歌词的索引文件输入到il.txt中,所以应当有一个函数实现输入倒排索引,而后建立文件输出txt: 0.bool Lyricsindex_out(Lyric_index_list index_list[],int m ){} //相关的有: struct

AVAudioPlayer简易封装

[说明] AVAudioPlayer简易封装,仅仅支持播放,暂停,停止,暂停时候带有渐隐效果,自己用,没有参考价值. [源码] https://github.com/YouXianMing/AVAudioPlayer- 一个定时器的封装类源码(该定时器可以指定运行的次数) // // SpecialTimer.h // Music // // Created by XianMingYou on 15/4/13. // Copyright (c) 2015年 XianMingYou. All ri

安装SFTP/FTP插件快速编辑远程服务器文件

默认的Sublime Text 3 是没有sftp/ftp功能的,如果编辑器自带ftp势必会提高开发效率,虽然Sublime Text 3 默认是没有ftp功能,但是安装sftp插件很容易.下面是我安装步骤,希望能帮助那些喜欢Sublime Text 3的朋友. 按下Ctrl+Shift+P调出命令面板 输入install 调出 Install Package 选项并回车,然后输入ftp,下拉列表中会出现一些相关的插件,选中sftp进行安装就行了, 出现下图说明安装成功了. 装好后还需配置如下:

linux系统上如何快速的查找一个文件?

以前看到过一句话:linux的水平体现在快速查找文件上~~~ ,或许这句话言过其实 但是因为linux上一切皆文件,任何我们想做的事情都可以通过编辑文件来完成, 如服务器的配置,维护,一切的一切我们都是在与文件打交道~·~· 下面我给大家介绍如何快速的查找一个文件 假如 查找的是脚本文件(执行文件)which filename 查找的是二进制的文件(执行文件)whereis -b filename 查找特定文件   whereis filename   (利用数据库来查找) locate 文件的