LRC歌词是一种应用广泛的歌词文件,各主流播放器都支持。

lrc歌词文本中含有两类标签:

1、标识标签(ID-tags)

[ar:艺人名]
[ti:曲名]
[al:专辑名]
[by:编者(指编辑LRC歌词的人)]
[offset:时间补偿值] 其单位是毫秒,正值表示整体提前,负值相反

2、 时间标签(Time-tag)

标准格式: [分钟:秒.毫秒] 歌词

例:[01:15.62]

在这里为了简便我只是解析了时间标签,对其进行解析时使用到了正则表达式:

正则表达式语法参考:http://www.cnblogs.com/wuqianling/p/5686139.html

示例歌词:

[ar:胡彦斌]
[ti:月光]
[00:00.86]月光(秦时明月主题曲)
[00:06.31]歌手 胡彦斌
[00:08.68]作词 林文炫
[00:10.49]作曲 胡彦斌
[00:20.11]月光色
[00:22.30]女子香
[00:24.51]泪断剑
[00:26.70]情多长
[00:28.95]有多痛
[00:30.97]无字想
[00:33.35]忘了你
[00:39.43]孤单魂
[00:41.51]随风荡
[00:43.57]谁去笑
[00:45.87]痴情郎
[00:48.03]这红尘的战场
[00:52.95]千军万马有谁能称王
[01:01.69]过情关
[01:06.00]谁敢闯
[01:10.42]望明月
[01:15.62]心悲凉
[01:19.13]千古恨
[01:23.45]轮回尝
[01:27.76]眼一闭
[01:32.71]谁最狂
[01:38.90]这世道的无常
[01:43.23]注定敢爱的人一生伤
[02:07.33]月光色
[02:09.20]女子香
[02:11.49]泪断剑
[02:13.58]情多长
[02:15.80]有多痛
[02:17.87]无字想
[02:20.23]忘了你
[02:26.21]孤单魂
[02:28.20]随风荡
[02:30.56]谁去笑
[02:32.64]痴情郎
[02:34.94]这红尘的战场
[02:39.70]千军万马有谁能称王
[02:48.65]过情关
[02:52.66]谁敢闯
[02:57.34]望明月
[03:02.44]心悲凉
[03:05.97]千古恨
[03:09.99]轮回尝
[03:14.67]眼一闭
[03:19.95]谁最狂
[03:30.06]过情关
[03:34.34]谁敢闯
[03:38.78]望明月
[03:43.92]心悲凉
[03:47.58]千古恨
[03:51.50]轮回尝
[03:55.96]眼一闭
[04:01.51]谁最狂
[04:07.21]这世道的无常
[04:21.34]注定敢爱的人一生伤

View Lyric

Java源代码:

 import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.regex.Matcher;
import java.util.regex.Pattern; public class TestLRC { public static void main(String[] args) {
String path = "D:\\a.lrc"; // 歌词文件路径
TestLRC lrc = new TestLRC();
List<Map<Long, String>> list = lrc.parse(path);
lrc.printLrc(list);
} /**
* 解析LRC歌词文件
*
* @param path
* lrc文件路径
* @return
*/
private List<Map<Long, String>> parse(String path) {
// 存储所有歌词信息的容器
List<Map<Long, String>> list = new ArrayList<Map<Long, String>>();
try {
// String encoding = "utf-8"; // 字符编码,若与歌词文件编码不符将会出现乱码
String encoding = "GBK";
File file = new File(path);
if (file.isFile() && file.exists()) { // 判断文件是否存在
InputStreamReader read = new InputStreamReader(
new FileInputStream(file), encoding);
BufferedReader bufferedReader = new BufferedReader(read);
String regex = "\\[(\\d{1,2}):(\\d{1,2}).(\\d{1,2})\\]"; // 正则表达式
Pattern pattern = Pattern.compile(regex); // 创建 Pattern 对象
String lineStr = null; // 每次读取一行字符串
while ((lineStr = bufferedReader.readLine()) != null) {
Matcher matcher = pattern.matcher(lineStr);
while (matcher.find()) {
// 用于存储当前时间和文字信息的容器
Map<Long, String> map = new HashMap<Long, String>();
// System.out.println(m.group(0)); // 例:[02:34.94]
// [02:34.94] ----对应---> [分钟:秒.毫秒]
String min = matcher.group(1); // 分钟
String sec = matcher.group(2); // 秒
String mill = matcher.group(3); // 毫秒,注意这里其实还要乘以10
long time = getLongTime(min, sec, mill + "0");
// 获取当前时间的歌词信息
String text = lineStr.substring(matcher.end());
map.put(time, text); // 添加到容器中
list.add(map);
}
}
read.close();
return list;
} else {
System.out.println("找不到指定的文件:" + path);
}
} catch (Exception e) {
System.out.println("读取文件出错!");
e.printStackTrace();
}
return null;
} /**
* 将以字符串形式给定的分钟、秒钟、毫秒转换成一个以毫秒为单位的long型数
*
* @param min
* 分钟
* @param sec
* 秒钟
* @param mill
* 毫秒
* @return
*/
private long getLongTime(String min, String sec, String mill) {
// 转成整型
int m = Integer.parseInt(min);
int s = Integer.parseInt(sec);
int ms = Integer.parseInt(mill); if (s >= 60) {
System.out.println("警告: 出现了一个时间不正确的项 --> [" + min + ":" + sec + "."
+ mill.substring(0, 2) + "]");
}
// 组合成一个长整型表示的以毫秒为单位的时间
long time = m * 60 * 1000 + s * 1000 + ms;
return time;
} /**
* 打印歌词信息
*/
private void printLrc(List<Map<Long, String>> list) {
if (list == null || list.isEmpty()) {
System.out.println("没有任何歌词信息!");
} else {
for (Map<Long, String> map : list) {
for (Entry<Long, String> entry : map.entrySet()) {
System.out.println("时间:" + entry.getKey() + " \t歌词:"
+ entry.getValue());
}
}
}
}
}

解析结果:

Java使用正则表达式解析LRC歌词文件的更多相关文章

  1. c#解析Lrc歌词文件

    看到很多人解析歌词文件时写了一大片的字符处理代码,而且看得不是很明白,所以自己研究了一下, 首先来了解下Lrc文件 时间格式: 1.标准格式: [分钟:秒.毫秒] 歌词 注释:括号.冒号.点号全都要求 ...

  2. 解析LRC歌词文件readlrc

    package com.jikexueyuan.readlrc.main; import com.jikexueyuan.readlrc.utils.Utils; import java.io.Fil ...

  3. 我的Android进阶之旅------>Android自定义View来实现解析lrc歌词并同步滚动、上下拖动、缩放歌词的功能

    前言 一LRC歌词文件简介 1什么是LRC歌词文件 2LRC歌词文件的格式 LRC歌词文件的标签类型 1标识标签 2时间标签 二解析LRC歌词 1读取出歌词文件 2解析得到的歌词内容 1表示每行歌词内 ...

  4. 如何将lrc歌词文件批量转换为ANSI编码?

    有些MP3.MP4或学习机只能播放ANSI编码的歌词文件,可是从网站上下载的歌词大多是UTF-8或者其它机器支持不了的编码,如何批量将这些lrc歌词文件转换成ANSI编码的文件呢? 工具/原料 萍客T ...

  5. 浅析LRC歌词文件

    [时间:2018-12] [状态:Open] [关键词:字幕,LRC,歌词,lyric,文件格式] 0 引言 几年前(2010年左右),网络音乐流行与免费的时代,网上有大量的mp3,使用比较常见的播放 ...

  6. 10行代码解析krc歌词文件

    互联网上,我们常见的歌词格式有 LRC.TRC(天天动听歌词).KRC(KuGou ResourCe,酷狗资源文件)和 QRC(QQ音乐歌词):在影视制作中,人们通常会用其他的卡拉 OK 字幕格式,例 ...

  7. LRC歌词文件读取代码

    /**************************************************/ /*******************-main文件-******************* ...

  8. IOS 用正则表达式解析HTML等文件,得到所有文本

    获得网页内容 NSURL *url=[NSURL URLWithString:@"http://121.199.34.52/wordpress/?json=core.get_post_con ...

  9. C#下载歌词文件

    前段时间写了一篇c#解析Lrc歌词文件,对lrc文件进行解析,支持多个时间段合并.本文借下载歌词文件来探讨一下同步和异步方法. Lrc文件在网络上随处可见,我们可以通过一些方法获取,最简单的就是别人的 ...

随机推荐

  1. servlet过滤器实现维护项目

    最近公司需要系统维护,提出要建一个维护系统,要求: 1.访问公司域名跳到系统首页 2.点击首页的任意按钮给出维护提示信息 3.用户访问之前收藏的任意系统链接跳转到首页 下面介绍下用过滤器实现上述需求 ...

  2. MapServer+TileCache+Apache+Python24 构建KS数据服务器

    刚刚配置好TileCache,准备开工. 期间碰到多种配置的问题,罗列一下. 1.mod_python的一个最主要优点就是在性能上超越传统CGI.所以使用mod_python替代CGI.前提是安装好a ...

  3. 转载自安卓巴士 【收藏】2015必须推荐的Android框架,猿必读系列!

    一.Guava Google的基于java1.6的类库集合的扩展项目,包括collections, caching, primitives support, concurrency libraries ...

  4. python 集合 -----直接用逗号连接的是元组,不是list

    t = 12345, 54321, 'hello!' >>> t[0] 12345 >>> t (12345, 54321, 'hello!') 元组:元组由逗号分 ...

  5. iOS设计中的“代理”

    “代理”--在iOS的开发设计中是一个非常重要的概念,同时又是十分基础的知识.所以,掌握“代理”势在必行! 以下,结合一个具体的例子,详细认识“代理”: 1, 图例解释: ①:定义两个文本输入框UIT ...

  6. BZOJ 1461: 字符串的匹配

    Description 同上题. Sol KMP+树状数组. 写这题的时候我灰常naive...不管了...直接贴代码... Code /******************************* ...

  7. 用批处理启动MySQL命令行工具

    最近在看MySQL,安装好之后,每次在开始菜单去启动MySQL命令行工具的时候,都是直接用root用户连接我本地的数据库 输入密码开始工作,但是要连接服务器上的MySQL的话,就要去CMD下运行 : ...

  8. [20160804]synchronized

    class Timer{ private static int num; void add(String name){ //synchronized (this){ num++; try{ Threa ...

  9. Game of Life I & II

    According to the Wikipedia's article: "The Game of Life, also known simply as Life, is a cellul ...

  10. Wince下sqlce数据库开发(一)

    对于Wince下的sqlce数据库虽然很多人在用,但在我查找资料时,却发现资料是多么的匮乏,在此对自己这几天的了解做个简单介绍,希望对大家能有所帮助! 本文的最后附有所使用到的sqlce在wince下 ...