我的歌词格式如下:
[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]
。
答案 0 :(得分:2)
答案 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");
答案 2 :(得分:0)
以下情况应该这样做(它确保所需的[hh:mm.ss]
不会跟随任何其他开始或结束括号,直到字符串结尾...这意味着它是你最后一个&#39 ;重新寻找):
(\[\d{1,2}:\d{1,2}\.\d{0,2}\])(?=[^\]\[]*$)