紧急求助,请教高手,字符串解析问题

aloie 2011-01-22 10:48:02
lrc歌词的解析,例如下面这样

str = "[02:31.00][02:24.00][01:36.00][01:27.00][00:09.00]Ay,Iyaiyai";

要如何解析,才能得到每个时间点的歌词?
...全文
90 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
aloie 2011-01-22
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 inhibitory 的回复:]
这样?^_^

Java code
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {
public static void main(String[] args) {
String str = "[02:31.00][02:24.00][0……
[/Quote]

还是不对呀,这样写,没有把时间点分开,输出是:
[02:31.00][02:24.00][01:36.00][01:27.00][00:09.00]:Ay,Iyaiyai

我想要这样的结果,能不能帮助实现一下,谢谢
[02:31.00]:Ay,Iyaiyai
[02:24.00]:Ay,Iyaiyai
[01:36.00]:Ay,Iyaiyai
[01:27.00]:Ay,Iyaiyai
[00:09.00]:Ay,Iyaiyai
Inhibitory 2011-01-22
  • 打赏
  • 举报
回复
这样?^_^
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {
public static void main(String[] args) {
String str = "[02:31.00][02:24.00][01:36.00][01:27.00][00:09.00]Ay,Iyaiyai";
Pattern p = Pattern.compile("((\\[\\d\\d:\\d\\d\\.\\d\\d\\])+)(.*)");
Matcher m = p.matcher(str);
while (m.find()) {
String time = m.group(1);
String lyric = m.group(3);
System.out.println(time + ":" + lyric);
}
}
}
aloie 2011-01-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 inhibitory 的回复:]
可以考虑下正则,试试下面的程序,不过歌词的具体规则描述得还是不够清晰

Java code
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {
public static void main(String[] args) {
String s……
[/Quote]

正则应该是个好方法,但是可能我没描述清楚,这个是歌词文件的一行,这5个时间点对应同一句歌词:Ay,Iyaiyai
Inhibitory 2011-01-22
  • 打赏
  • 举报
回复
可以考虑下正则,试试下面的程序,不过歌词的具体规则描述得还是不够清晰
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {
public static void main(String[] args) {
String str = "[02:31.00]A[02:24.00]B[01:36.00][01:27.00][00:09.00]Ay,Iyaiyai";
Pattern p = Pattern.compile("(\\[\\d\\d:\\d\\d\\.\\d\\d\\])([^\\[\\]]*)");
Matcher m = p.matcher(str);
while (m.find()) {
String time = m.group(1);
String lyric = m.group(2);
System.out.println(time + lyric);
}
}
}

输出:
[02:31.00]A
[02:24.00]B
[01:36.00]
[01:27.00]
[00:09.00]Ay,Iyaiyai
wuyu637 2011-01-22
  • 打赏
  • 举报
回复
"[02:31.00][02:24.00][01:36.00][01:27.00][00:09.00]Ay,Iyaiyai";

根据http://wenku.baidu.com/view/a2c008d8ce2f0066f53322c7.html
百度文档的定义,
[]内的表示的是歌词开始显示的时间,所以

"[02:31.00][02:24.00][01:36.00][01:27.00][00:09.00]Ay,Iyaiyai";
"xxx";
"yyyy";
"kkkk";

你用做的就是把[]里的时间,全部存到一个数组里,然后根据时间前后排序,,
time[0],time[1],time[xxxx].
在生成这个数组的同时,记录每个时间断词
words[0],words[1],words[xxx].

查询的时候只要根据当前的时间去找time数组里第一个比它的大的时间点,然后它的前一个时间点对应的words就是要显示的歌词
thy_java 2011-01-22
  • 打赏
  • 举报
回复
我的思路是迭代这个字符串 如果是数字就给它取出来 每6个数字是一组 可以存到数组里
疯癫行者 2011-01-22
  • 打赏
  • 举报
回复
这是完整的歌词文件格式吗?
aloie 2011-01-22
  • 打赏
  • 举报
回复
高手,厉害,太厉害了,谢谢!
Inhibitory 2011-01-22
  • 打赏
  • 举报
回复
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {
public static void main(String[] args) {
String lyric = "";
List<String> timeAndLyric = new ArrayList<String>();
String str = "[02:31.00][02:24.00][01:36.00][01:27.00][00:09.00]Ay,Iyaiyai";

Pattern p = Pattern.compile("((\\[\\d\\d:\\d\\d\\.\\d\\d\\])+)(.*)");
Matcher m = p.matcher(str);
while (m.find()) {
lyric = m.group(3);
}

p = Pattern.compile("\\[\\d\\d:\\d\\d\\.\\d\\d\\]");
m = p.matcher(str);
while (m.find()) {
String time = m.group();
timeAndLyric.add(time + ":" + lyric);
}

for (String s : timeAndLyric) {
System.out.println(s);
}
}
}

输出:
[02:31.00]:Ay,Iyaiyai
[02:24.00]:Ay,Iyaiyai
[01:36.00]:Ay,Iyaiyai
[01:27.00]:Ay,Iyaiyai
[00:09.00]:Ay,Iyaiyai
Inhibitory 2011-01-22
  • 打赏
  • 举报
回复
那你照着第一个的方式做,把他们存入数组就可以了,然后再把所有的歌词用最后的一个替换一下就可以了

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧