• 快速简易的分解歌词文件


    快速简易的分解歌词文件

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

    李克勤 - 月半夜小夜曲.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:@"
    "];
        
        // 分解歌词
        [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来帮助你解决问题.

  • 相关阅读:
    flv mime IIS设置
    正则表达式
    MATLAB out of memory
    Cyclic prefix
    Windows Live Writer Test
    zz排序算法的稳定性
    MATLAB的分数和小数
    young矩阵学习
    Python初体验(二)
    利用VS2010调用Excel的宏
  • 原文地址:https://www.cnblogs.com/YouXianMing/p/3809362.html
Copyright © 2020-2023  润新知