码迷,mamicode.com
首页 > 编程语言 > 详细

Java使用正则表达式解析LRC歌词文件

时间:2016-07-09 23:40:56      阅读:507      评论:0      收藏:0      [点我收藏+]

标签:

 LRC歌词是一种应用广泛的歌词文件,对其进行解析时

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

 

  1 import java.io.BufferedReader;
  2 import java.io.File;
  3 import java.io.FileInputStream;
  4 import java.io.InputStreamReader;
  5 import java.util.ArrayList;
  6 import java.util.HashMap;
  7 import java.util.List;
  8 import java.util.Map;
  9 import java.util.Map.Entry;
 10 import java.util.regex.Matcher;
 11 import java.util.regex.Pattern;
 12 
 13 public class TestLRC {
 14 
 15     public static void main(String[] args) {
 16         String path = "D:\\a.lrc"; // 歌词文件路径
 17         TestLRC lrc = new TestLRC();
 18         List<Map<Long, String>> list = lrc.parse(path);
 19         if (list != null) {
 20             printLrc(list);
 21         }
 22     }
 23 
 24     /**
 25      * 解析LRC歌词文件
 26      * 
 27      * @param path
 28      *            lrc文件路径
 29      * @return
 30      */
 31     private List<Map<Long, String>> parse(String path) {
 32         // 存储所有歌词信息
 33         List<Map<Long, String>> list = new ArrayList<Map<Long, String>>();
 34         try {
 35             // String encoding = "utf-8"; // 字符编码,若与歌词文件编码不符将会出现乱码
 36             String encoding = "GBK";
 37             File file = new File(path);
 38             if (file.isFile() && file.exists()) { // 判断文件是否存在
 39                 InputStreamReader read = new InputStreamReader(
 40                         new FileInputStream(file), encoding);
 41                 BufferedReader bufferedReader = new BufferedReader(read);
 42                 String regex = "\\[(\\d{1,2}):(\\d{1,2}).(\\d{1,2})\\]";
 43                 Pattern pattern = Pattern.compile(regex); // 创建 Pattern 对象
 44                 String lineStr = null; // 每次读取一行字符串
 45                 while ((lineStr = bufferedReader.readLine()) != null) {
 46                     Matcher matcher = pattern.matcher(lineStr);
 47                     while (matcher.find()) {
 48                         // 用于存储当前时间和文字信息的容器
 49                         Map<Long, String> map = new HashMap<Long, String>();
 50                         // System.out.println(m.group(0)); // 例:[02:34.94]
 51                         // [02:34.94] ----对应---> [分钟:秒.毫秒]
 52                         String min = matcher.group(1); // 分钟
 53                         String sec = matcher.group(2); //
 54                         String mill = matcher.group(3); // 毫秒,注意这里其实还要乘以10
 55                         long time = getLongTime(min, sec, mill + "0");
 56                         // 获取当前时间的文本内容
 57                         String text = lineStr.substring(matcher.end());
 58                         // System.out.println("text-->" + text);
 59                         map.put(time, text); // 添加到容器中
 60                         list.add(map);
 61                     }
 62                 }
 63                 read.close();
 64                 return list;
 65             } else {
 66                 System.out.println("找不到指定的文件:" + path);
 67             }
 68         } catch (Exception e) {
 69             System.out.println("读取文件内容出错!");
 70             e.printStackTrace();
 71         }
 72         return null;
 73     }
 74 
 75     /**
 76      * 将以字符串形式给定的分钟、秒钟、毫秒转换成一个以毫秒为单位的long型数
 77      * 
 78      * @param min
 79      *            分钟
 80      * @param sec
 81      *            秒钟
 82      * @param mill
 83      *            毫秒
 84      * @return
 85      */
 86     private long getLongTime(String min, String sec, String mill) {
 87         // 转成整型
 88         int m = Integer.parseInt(min);
 89         int s = Integer.parseInt(sec);
 90         int ms = Integer.parseInt(mill);
 91 
 92         if (s >= 60) {
 93             System.out.println("警告: 出现了一个秒钟不正确的项 --> [" + min + ":" + sec + "."
 94                     + mill.substring(0, 2) + "]");
 95         }
 96         // 组合成一个长整型表示的以毫秒为单位的时间
 97         long time = m * 60 * 1000 + s * 1000 + ms;
 98         return time;
 99     }
100 
101     /**
102      * 打印歌词信息
103      */
104     private static void printLrc(List<Map<Long, String>> list) {
105         if (list != null && list.isEmpty()) {
106             System.out.println("没有任何歌词信息!");
107         }
108         for (Map<Long, String> map : list) {
109             for (Entry<Long, String> entry : map.entrySet()) {
110                 System.out.println("时间:" + entry.getKey() + "  \t歌词:"
111                         + entry.getValue());
112             }
113         }
114     }
115 }

 

Java使用正则表达式解析LRC歌词文件

标签:

原文地址:http://www.cnblogs.com/wuqianling/p/5656761.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!