如何删除比赛的最后一次?

时间:2015-02-01 16:50:55

标签: javascript jquery regex

我的歌词格式如下:

[00:26.8]Lo [00:27.0]rem[00:27.2] Ipsum[00:27.4] sam[00:27.6]ple [00:27.9]text[00:28.1] to [00:28.5]
[00:28.51]demonstrate[00:28.7] the[00:28.9] lyrics[00:29.1] text

我使用以下正则表达式匹配时间标记([hh:mm.ss]):

/\[\d{1,2}:\d{1,2}\.\d{0,2}\]/ig

但是如何找到并删除上一个时间标记(上例中的[00:29.1])?了解我可以匹配所有出现,取最后一个,在文本中找到相应标签的位置(使用lastIndexOf),然后删除标签。但有没有更好的方法来实现它?

UPD。还有一个条件 - 如果时间标记位于行的开头,则不应删除它。即如果是歌词:

[00:26.8]Lo [00:27.0]rem[00:27.2] Ipsum[00:27.4] sam[00:27.6]ple [00:27.9]text[00:28.1] to [00:28.5]
[00:28.51]demonstrate

找到并删除的代码应为[00:28.5],而不是[00:28.51]

3 个答案:

答案 0 :(得分:2)

添加前瞻断言以确保[..]跟随匹配的字符串

/\[\d{1,2}:\d{1,2}\.\d{0,2}\](?!(.|\n)*\[)/

Regex Demo

答案 1 :(得分:1)

也可以通过在吃饭之前添加贪婪的[^]*[\s\S]*而无需预测即可。

var str = str.replace(/^([^]*)(\[\d{1,2}:\d{1,2}\.\d{0,2}\])/, "$1");

替换为捕获的第一部分。 See fiddle


广告更新:在{}之前添加[^\n]

var str = str.replace(/^([\s\S]*[^\n])(\[\d{1,2}:\d{1,2}\.\d{0,2}\])/, "$1");

See fiddle

答案 2 :(得分:0)

以下情况应该这样做(它确保所需的[hh:mm.ss]不会跟随任何其他开始或结束括号,直到字符串结尾...这意味着它是你最后一个&#39 ;重新寻找):

(\[\d{1,2}:\d{1,2}\.\d{0,2}\])(?=[^\]\[]*$)

DEMO