快速简易的分解歌词文件

简介:

快速简易的分解歌词文件

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

李克勤 - 月半夜小夜曲.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来帮助你解决问题.

 

目录
相关文章
|
区块链 算法 数据安全/隐私保护
带你读《区块链开发实战: 基于JavaScript的公链与DApp开发》之一:自己动手实现一个区块链系统
本书用三个部分讲解了区块链技术以及Asch的相关实践,第一部分讲解了区块链技术的基本概念,并用300行代码实现了一个最小的、可运行的区块链;第二部分分析Asch的源码,讲解Asch的实现原理;第三部分介绍了基于Asch的侧链技术的DApp开发实战。
|
JavaScript
源码学习:Vite中加载环境变量(loadEnv)的实现
源码学习:Vite中加载环境变量(loadEnv)的实现
8023 0
|
4月前
|
芯片 C++ Perl
南京观海微电子---多路降压稳压DC-DC开关电源电路设计(3.3V、5V、12V、ADJ)
LM2596是一款高效率降压稳压芯片,支持3A输出电流,输入电压可达40V,具有过热、限流保护功能。提供固定(3.3V/5V/12V)和可调(ADJ)版本,广泛用于电源转换设计。
南京观海微电子---多路降压稳压DC-DC开关电源电路设计(3.3V、5V、12V、ADJ)
|
2月前
|
存储 弹性计算 运维
2026年阿里云ECS云服务器部署OpenClaw(Clawdbot)+配置百炼 API 步骤流程
OpenClaw(原Clawdbot/Moltbot)作为阿里云生态下的开源AI自动化代理工具,凭借自然语言交互、全场景任务自动化、插件化扩展的核心能力,已成为个人办公提效、企业轻量化数字化转型的核心工具。2026年阿里云ECS云服务器针对OpenClaw推出“一键部署”方案,将原本需要手动配置环境、安装依赖、调试参数的复杂流程,简化为可视化表单配置+自动化执行,即使是零基础的技术新手,也能在10分钟内完成从ECS实例创建到OpenClaw服务可用的全流程。本文将详细拆解阿里云ECS云服务器一键部署OpenClaw的完整步骤,包含配置要点、代码命令、功能验证与运维技巧,覆盖从新手入门到企业级应
483 8
|
8月前
|
Rust Ubuntu Java
官方支持长达12年!Ubuntu 24.04 LTS正式开放升级:Linux 6.8内核
对于开发者而言,Ubuntu 24.04 LTS在性能工程和机密计算方面迈出了重要一步,包含了Python 3.12、Ruby 3.2、PHP 8.3和Go 1.22等最新编程语言版本,重点优化了对.NET、Java和Rust等开发环境的支持。
|
SQL 分布式计算 Java
Hadoop-11-MapReduce JOIN 操作的Java实现 Driver Mapper Reducer具体实现逻辑 模拟SQL进行联表操作
Hadoop-11-MapReduce JOIN 操作的Java实现 Driver Mapper Reducer具体实现逻辑 模拟SQL进行联表操作
286 3
|
SQL NoSQL 数据库
SpringCloud基础6——分布式事务,Seata
分布式事务、ACID原则、CAP定理、Seata、Seata的四种分布式方案:XA、AT、TCC、SAGA模式
SpringCloud基础6——分布式事务,Seata
|
SQL 前端开发 Java
迄今为止最好用的Flink SQL教程:Flink SQL Cookbook on Zeppelin
无需写任何代码,只要照着这篇文章轻松几步就能跑各种类型的 Flink SQL 语句。
迄今为止最好用的Flink SQL教程:Flink SQL Cookbook on Zeppelin
|
机器学习/深度学习 自然语言处理 语音技术
|
存储 安全 Java
从HTTP到Tomcat:揭秘Web应用的底层协议与高性能容器
从HTTP到Tomcat:揭秘Web应用的底层协议与高性能容器