如何删除匹配项的最后一个匹配项

How to delete the last occurence of the match?

本文关键字:最后一个 何删除 删除      更新时间:2023-09-26

我的歌词格式如下:

[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),然后删除标签。但是有没有更好的方法来实现它呢?

更新。还有一个条件 - 如果时间标签位于行首,则不应将其删除。即在歌词的情况下:

[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]

添加前瞻断言,以确保匹配的字符串后面没有[..]

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

正则表达式演示

也可以通过在吃掉之前添加一个贪婪的[^]*['s'S]*来做到这一点。

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

替换为捕获的第一部分。见小提琴


广告更新:在以下位置添加[^'n]

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

见小提琴

下面应该做(它确保想要的[hh:mm.ss]后面没有任何其他左括号或右括号,直到字符串的末尾......这意味着这是您要查找的最后一个):

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

演示