使用Sublime Text中的正则表达式进行搜索和替换:在搜索文本之前替换文本

时间:2014-04-16 23:49:48

标签: html regex replace sublimetext2

所以这将是我的样本:

In Kenya since 2010 <a href="https://www.youtube.com/watch?v=fDTGpMJi0OI&list=PLqGkpApxFsX8k8ENdCr-9v8iRa2q5jXaE&" onclick="yt.www.watch.player.seekTo(2*60+48);return false;">2:48</a> 
Where comes from: Bukavu <a href="https://www.youtube.com/watch?v=fDTGpMJi0OI&list=PLqGkpApxFsX8k8ENdCr-9v8iRa2q5jXaE&" onclick="yt.www.watch.player.seekTo(3*60+29);return false;">3:29</a>
She would have been killed <a href="https://www.youtube.com/watch?v=fDTGpMJi0OI&list=PLqGkpApxFsX8k8ENdCr-9v8iRa2q5jXaE&" onclick="yt.www.watch.player.seekTo(5*60+15);return false;">5:15</a> 

现在时间m:ss(如 2:48 )应该保持原样,但也可以附加到之前之前的链接,在&之后#34;&安培;&#34;并采用以下格式: 2:48 应该变为 t = 2m48s

所以,最后,整个事情应该是这样的(检查链接的结尾)

In Kenya since 2010 <a href="https://www.youtube.com/watch?v=fDTGpMJi0OI&list=PLqGkpApxFsX8k8ENdCr-9v8iRa2q5jXaE&t=2m48s" onclick="yt.www.watch.player.seekTo(2*60+48);return false;">2:48</a> 
Where comes from: Bukavu <a href="https://www.youtube.com/watch?v=fDTGpMJi0OI&list=PLqGkpApxFsX8k8ENdCr-9v8iRa2q5jXaE&t=3m29s" onclick="yt.www.watch.player.seekTo(3*60+29);return false;">3:29</a>
She would have been killed <a href="https://www.youtube.com/watch?v=fDTGpMJi0OI&list=PLqGkpApxFsX8k8ENdCr-9v8iRa2q5jXaE&t=5m15s" onclick="yt.www.watch.player.seekTo(5*60+15);return false;">5:15</a>

现在我发现,我可以使用 \ d:.. 来查找时间,但我不知道如何继续或者是否可以使用崇高文本?

1 个答案:

答案 0 :(得分:1)

更新2:

我发誓我在YouTube上查了一下,然后我就可以使用&t=h5m10s转到视频,它可以用作0:05:10。如果您需要5m10s0h5m10s,则需要执行两个不同的表达式(因为Sublime Text不允许您在正则表达式替换上执行复杂的回调函数)。

替换h:mm:ss

href="(.*?)"(.*?)>(\d*):(\d{2}):(\d{2})

href="$1&t=$3h$4m$5s"$2>$3:$4:$5

替换m:ss

href="(.*?)"(.*?)>(\d{1,2}):(\d{2})(?!:\d)

href="$1&t=$3m$4s"$2>$3:$4

需要解释的唯一不寻常的语法是(?!:\d)?!语法用于“负向前瞻”。这意味着匹配组后面不会追加:\d,否则会匹配小时/分钟/秒。


<强>更新

这是updated expression for matching optional hours。我仔细检查过,你可以使用&t=h##m##s(如果它不匹配,则为空白小时)。这意味着我们可以进行一次搜索/替换,如果它不存在则只有一小时的空白捕获(你会在一秒钟内看到我的意思)。

匹配这个:

href="(.*?)"(.*?)>((?:(\d*):)?(\d{1,2}):(\d{2}))

并替换为:

href="$1&t=$4h$5m$6s"$2>$3

事情在这里变得有点复杂。让我们仔细看看变化的部分:

(            # start an overarching capture group
  (\d*):?    # capture 0+ digits followed by an optional : (hours)
  (\d{1,2}): # capture 1-2 digits followed by a : (minutes)
  (\d{2})    # capture the last 2 digits (seconds)
)            # end the capture group

现在您可能想知道为什么我使用了那个首要的捕获组。这是因为我们需要一种方法来保持锚链接的内容相同。如果我们不使用此功能,则必须将其替换为hour:minute:second,并且小时可能为空(意味着3:45将替换为:3:45)。


你可以匹配:

href="(.*?)"(.*?)>(\d)+:(\d{2})

并将其替换为

href="$1&t=$3m$4s"$2>$3:$4

这是如何工作的,它首先找到任何锚点的href,同时捕获第一个捕获组中的内容。然后我们捕获第二个捕获组中>的所有内容。接下来我们捕获1位数(第三次捕获),然后是:,最后捕获最后2位数(第四次捕获)。

我们基本上用相同的内容替换它,但请确保将&t=$3m$4s附加到链接的末尾。您可以在Regex101上看到一个有效的示例。