Android 台灣中文網

標題: android 之 正则表达式解析LRC文件(歌詞文件) [打印本頁]

作者: lucky_jayce    時間: 2013-5-27 15:49
標題: android 之 正则表达式解析LRC文件(歌詞文件)
如果你要開發android的音乐,那势必涉及到解析lrc文件。
百度了很多文章,但最终没得到预期的效果。最终还是被我找到一篇合意的

原文链接[url]http://java-mzd.iteye.com/blog/811374[/url]


首先

我们应该明白LRC文件的组成

LRC文件本质就是个符合一定格式规范的文本文件

这一点对照XML文件就很好理解了

一个LRC文件的组成

通常由以下几个部分组成

[ti:约定]-------标题
[ar:周惠]------演唱者
[al:周蕙-精选]-------专辑
[00:26.00]远处的钟声回荡在雨里--------每句内容由一个时间点和内容组成

同时应该注意到
[02:23.00][00:49.00]一路从泥泞走到了美景---------在每个内容可能出现多个时间点  


然后

我们 用一个实体类

LrcInfo

来封装每个Lrc文件的具体内容


Java代码  [url=]

                               
登錄/註冊後可看大圖
[/url]




3.读入Lrc文件,开始逐行解析

   解析步骤:

     1.读入文件

     2.封装为BufferedReader对象

     3.调用readline()方法逐行读取数据,得到String str

     4.用parser()方法解析每一条具体的String语句

     5.每句解析完后,将得到的内容在LrcInfo对象中进行设置



Java代码  [url=]

                               
登錄/註冊後可看大圖
[/url]




以上代码难度都不大

个人觉得

正则表达式其实并不难

只是因为有很多不规则符号堆叠在一起

让我们直观的很难理解

掌握符号规则后

还是挺好用的



正则表达在JAVA中都被封装在

regex包下面

主要是Pattern类与Matcher类



其实我个人在掌握了正则的基本概念后

用JAVA写这个代码却花了不少时间


主要是对这两个对象中的一些方法理解错误


以下简单总结下

两个类中易理解错的方法


Matcher对象中

matcher()方法是匹配整个字符串
lookingat()是匹配字符串的开头
find()是查找字符串中能否匹配


使用find()方法

得到一个字符串中的匹配后

matcher.start()得到这个匹配的startIndex
matcher.end()得到这个匹配的endIndex


matcher.group()能得到满足匹配的全部内容(最大的一个组)


matcher.groupCount()能得到当前匹配中的组数------(在正则中用()包围起来的一个部分算一个单独的组)
marcher.group(i) 得到指定的某个组的内容

又通过matcher.find()

我们可能在某一行可以得到多个匹配结果

每当调用一次matcher.find()

当前匹配对象就自动换为下个匹配成功对象


要遍历所有匹配结果




最后

我们解析完LRC文件后

在播放Mp3时

只需要根据播放时间

取出HashMap中的内容进行显示即可






歡迎光臨 Android 台灣中文網 (https://apk.tw/) Powered by Discuz! X3.1