两个正则表达式的组合

Combining two regular expressions

本文关键字:正则表达式 组合 两个      更新时间:2023-09-26

我有一个关于在正则表达式中完成某些事情的问题,即是否可能,如果可能,如何实现。

我正在做的事情的简要简介:我在网上读《曼加》。我喜欢在一个新的选项卡中打开当前问题,但我不总是记得用鼠标中键单击链接。

所以我决定写一个Greasemonkey脚本,它可以在任何网站页面上运行,在任何引用漫画或漫画问题的锚标签上添加target="_blank",这样经常点击就会在新标签中打开它。脚本本身运行良好,没有什么了不起的。

现在注意:

我们称之为每个Manga的链接模式如下

    <language of manga>/<manga name> 
      links to the main about page for the manga
    <language of manga>/<manga name>/<issue number> 
      links to the issue number itself
    <language of manga>/<manga name>/<issue number>/<page number> 
      links to the specific page of the issue

现在我希望它总是让前两个在新的选项卡中打开,但我不希望最后一个在新选项卡中打开。原因是当阅读实际的Manga时,每次点击以推进页面都会打开一个新的选项卡。

因此,为了实现这一点,我有两个正则表达式:

    var MangaIssueRegex = /en-manga'/[A-Za-z0-9'-]+'//;
    var MangaIssuePageRegex = /en-manga'/[A-Za-z0-9'-]+'/('d+'/){2}/

第一个正则表达式选择三种漫画链接模式中的任何一种。第二个正则表达式只选择第三个漫画链接模式(用于特定页面的模式)

简而言之,Greasemonkey脚本在加载时遍历页面上的所有锚标记,如果锚标记的href属性通过MangaIssueRegex,并且Mangaissue PageRegex失败,则锚标记将被修改为在新选项卡中打开,否则锚标记不会被修改。

现在,是否可以将两个正则表达式组合为一个正则表达式,该表达式将匹配前两种模式,但如果遇到第三种模式,则会失败?

以下是整个脚本:

    var MangaIssueRegex = /en-manga'/[A-Za-z0-9'-]+'//;
    var MangaIssuePageRegex = /en-manga'/[A-Za-z0-9'-]+'/('d+'/){2}/
    var elements = document.getElementsByTagName("a");
    for (var i = 0; i < elements.length; i++)
    {
      if (MangaIssueRegex.test(elements[i].getAttribute("href")) && !MangaIssuePageRegex.test(elements[i].getAttribute("href")))
      {
        elements[i].setAttribute("target","_blank");
        elements[i].setAttribute("title","Opens in another tab");
      }
    }

更新

感谢@DanielHilgarth和@iMoses帮助我弄清楚

我发现我可以在Greasemonkey中使用jQuery,所以最终我得到了完整的工作脚本

$("a")
  .filter(function(){return /en-manga'/['w'-]+'/('d+'/)?$/.test(this.href);})
  .each(function(index){$(this).attr({title:"Opens in new tab",target:"_blank"});});

如果只匹配前两种模式,请尝试使用:

var MangaIssuePageRegex = /en-manga'/[A-Za-z0-9'-]+'/('d+'/)?$/

这将匹配:

<language of manga>/<manga name> 

以及:

<language of manga>/<manga name>/<issue number> 

如果你不想强制使用一个结束反斜杠,请使用这个Regex:

var MangaIssuePageRegex = /en-manga'/[A-Za-z0-9'-]+('/'d+)?('/)?$/

不能在末尾添加文本末尾锚吗?

类似这样的东西:

/en-manga'/([A-Za-z0-9'-]+'/){1,2}$/

这将匹配

en-manga/asd/
en-manga/asd/12/

但不是

en-manga/asd/12/123/

你可以自己测试。

看起来您想在第一个正则表达式结束时匹配它,在这种情况下,请尝试将其更改为:

var MangaIssueRegex = /en-manga'/[A-Za-z0-9'-]+'/?$/

http://jsfiddle.net/ZTGuB/1/