【问题标题】:Search and replace using Regular Expressions in Sublime Text: replace text before search text在 Sublime Text 中使用正则表达式进行搜索和替换:在搜索文本之前替换文本
【发布时间】:2014-04-16 23:49:47
【问题描述】:

所以这将是我的示例:

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)应该留在原地,但也可以附加到 之前的链接,在 " &" 并采用以下格式: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:.. 来查找时间,但我不知道如何继续,或者是否可以使用 sublime text? p>

【问题讨论】:

    标签: html regex replace sublimetext2


    【解决方案1】:

    更新 2:

    我发誓我在 YouTube 上查看过,我可以使用 &amp;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。我仔细检查过,您可以使用&amp;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,同时捕获 first 捕获组中的内容。然后我们在第二个捕获组中捕获直到&gt; 的所有内容。接下来我们捕获 1+ 位(third 捕获),然后是 :,最后捕获最后 2 位(fourth 捕获)。

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

    【讨论】:

    • 您应该可以像这样在 Sublime Text 中将其用作正则表达式查找/替换。如果它不起作用,请告诉我..Sublime Text 如何处理捕获的组可能有一些特别之处。
    • 太棒了!顺便说一句,我使用它来复制和修复其中包含时间链接的 youtube 描述。 (当您复制它们时它们会损坏)我所做的是将它们复制到设计视图中的 Dreamweaver,然后转到代码视图并应用您的搜索和替换。完美运行。
    • 可悲的是,我意识到它只有在分钟不超过一位数时才有效。所以它适用于 6m23s 但是当它的 16m23s 它将忽略 1。有什么解决办法吗?最好是它也能够处理这种格式 1:16:23 并在链接末尾将其转换为 1h16m23s
    • 当我使用你的最后一个建议时,它会将 16:12 变成 1h6m16s。当我的时间超过一个小时时,它确实有效,但它会弄乱小于一个小时的时间。
    • 其实我就是这么做的。我和我不精确的 cmets :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-28
    • 1970-01-01
    • 1970-01-01
    • 2018-05-25
    相关资源
    最近更新 更多