快速简易的分解歌词文件

快速简易的分解歌词文件

以下是一个歌词文件,如何快速的分解出来呢?

李克勤 - 月半夜小夜曲.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循环高哦.

YXRegex.h + YXRegex.m

//
//  YXRegex.h
//  Regex
//
//  Copyright (c) 2014年 Y.X. All rights reserved.
//

#import <Foundation/Foundation.h>

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

@interface YXRegex : NSObject

#pragma mark - 可读写属性
@property (nonatomic, strong)   NSString   *regexString;
@property (nonatomic, strong)   NSString   *sourceString;

#pragma mark - 只读属性
@property (nonatomic, readonly) NSUInteger  numberOfMatches;

#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
//
//  YXRegex.m
//  Regex
//
//  Copyright (c) 2014年 Y.X. All rights reserved.
//

#import "YXRegex.h"

@interface YXRegex ()

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

@end

@implementation YXRegex

- (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];

        // 获取到个数
        _numberOfMatches = [_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

分解歌词的源码:

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

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

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

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

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

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

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

                       // 打印出信息
                       NSLog(@"%@ --> %@", time, tmpStr);
                   }];
    }];

打印信息如下:

要善于利用NSRange来帮助你解决问题.

 

时间: 2024-12-22 00:24:32

快速简易的分解歌词文件的相关文章

android-如何快速的编写Android布局文件?

问题描述 如何快速的编写Android布局文件? 感觉手写布局文件效率太低了,或者说有在哪位大神能推荐一个Android模板布局网站,如果在开发的时候能有一些模板布局文件那么效率也会大大的提高. 解决方案 android 编写布局文件Alt+/不能自动补全Android 的布局文件中的注释Android布局文件xml 解决方案二: 想法不错 不过貌似没有这种网站吧 解决方案三: 可以在xml文件中拖拽控件.. 解决方案四: 只能手写,没办法,快捷一点就是用自带的自动补全.androidstudi

C#下载歌词文件的同步和异步方法_C#教程

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

c# 递归访问文件夹(删掉歌词文件)_C#教程

复制代码 代码如下: using System; using System.IO; namespace DelAllLrcFiles { class Program { static readonly string root = @"E:\我的音乐\Classic\"; static readonly string ext = ".lrc"; static void Main(string[] args) { DelAllLrc(root); } /// <s

快速调用记事本编辑网页文件

我们在制作网页时,由于一些网页编辑软件有时会改变我们已设置好的网页元素,因此经常要用记事本对网页文件进行编辑.修改.如何才能快速调用记事本对网页文件进行编辑和修改呢?只要对注册表略作改动即可实现此功能. 点击"开始"→"运行",在对话框中输入"regedit",打开注册表编辑器,展开HKEY_CLASSES_ROOThtmlfileshell分支.在该分支下新建一个名为"QuickEdit"的子分支并将"QuickE

如何快速访问局域网中的文件夹

  每次访问局域网中的文件夹时,都需要通过"网上邻居",或者输入IP地址.主机名,才能访问,很麻烦. 快速访问保存在局域网中的文件夹,先在"网上邻居"中,找到局域网中需要经常访问的共享文件夹,在地址栏中将地址复制.然后右击桌面空白处,选择"新建""快捷方式",然后在"请键入项目的位置"选项中,将复制的共享文件夹地址粘贴.单击"下一步",然后给快捷方式起一个命名,设置完毕后,在桌面双击快捷

MAC快速显示或隐藏“隐藏”文件

  在类Unix系统和Linux系统中的"隐藏"文件都是以点"."为文件名开头的.在Mac OS中也是如此.此种文件在默认的Finder和各种应用程序中是不显示的.这样做的一个好处是,很多时候那些"隐藏"文件里可能包含了某个应用程序的重要配置,重要数据等信息,如果"不明真相"的用户拿去不小心修改了可能会影响程序的运行. 当然,这个也是可以通过系统的设置来决定那些"隐藏"文件是否显示的.如果要显示.开头的文件

快速通过XSL转换XML文件

XML可以只注重数据与文件格式的描述,而显示方面的工作就交给排版样式表.排版样式表分:CSS和XSL.其中XSL非常适合XML.   最近,我喜欢上了XML编程,但又苦于它的美观程度又不够,找了许多书才搞定. 用XML好是蛮好,但它还是不太适合做显示数据的语言.(比起HTML要查多了!) XML文件作出来的东西看起来并不是那么美观,但还是可以找到补救的方法. XML可以只注重数据与文件格式的描述,而显示方面的工作就交给排版样式表. 排版样式表分:CSS和XSL.其中XSL非常适合XML.(在这里

如何快速通过XSL转换XML文件

xml|转换 最近,我喜欢上了XML编程,但又苦于它的美观程度又不够,找了许多书才搞定. 用XML好是蛮好,但它还是不太适合做显示数据的语言.(比起HTML要查多了!) XML文件作出来的东西看起来并不是那么美观,但还是可以找到补救的方法. XML可以只注重数据与文件格式的描述,而显示方面的工作就交给排版样式表. 排版样式表分:CSS和XSL.其中XSL非常适合XML.(在这里不讨论CSS!) 现在开始转换吧! XSL包含两大部分:XSLT和XSL Formatting Object XSLT(

C#技巧之快速删除bin和obj文件夹的方法

C#程序总会生成bin和obj文件夹,为了减小源码的大小,就有必要将这两个文件夹删除,于是想到用批处理文件来删除   以下是批处理的代码: @echo off set nowPath=%cd% cd cd %nowPath% ::delete specify file(*.pdb,*.vshost.*) for /r %nowPath% %%i in (*.pdb,*.vshost.*) do (del %%i) ::delete specify folder(obj,bin) for /r %