Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/435.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 组合两个正则表达式_Javascript_Regex - Fatal编程技术网

Javascript 组合两个正则表达式

Javascript 组合两个正则表达式,javascript,regex,Javascript,Regex,我有一个关于在正则表达式中实现某些东西的问题,即它是否可能,如果可能,如何实现 我正在做的事情简介:我在网上看漫画。我喜欢在一个新的选项卡中打开当前的问题,但我不记得总是用鼠标中键单击链接 因此,我决定编写一个Greasemonkey脚本,它将在任何网站页面上运行,并在引用漫画或该漫画发行版的任何锚定标记中添加一个target=“\u blank”,以便定期单击可在新选项卡中打开它。剧本本身运行良好,没有什么惊人之处 现在进入警告: 我们将为每个漫画调用的链接模式如下 <langu

我有一个关于在正则表达式中实现某些东西的问题,即它是否可能,如果可能,如何实现

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

因此,我决定编写一个Greasemonkey脚本,它将在任何网站页面上运行,并在引用漫画或该漫画发行版的任何锚定标记中添加一个
target=“\u blank”
,以便定期单击可在新选项卡中打开它。剧本本身运行良好,没有什么惊人之处

现在进入警告:

我们将为每个漫画调用的链接模式如下

    <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
第一个正则表达式选择三种漫画链接模式中的任何一种。 第二个正则表达式只拾取第三个漫画链接模式(用于特定页面的模式)

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

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

以下是整个脚本:

    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");
      }
    }

你不能在结尾添加文本结尾锚吗

大概是这样的:

/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\-]+\/?$/

要仅匹配前两种模式,请尝试使用:

var MangaIssuePageRegex = /en-manga\/[A-Za-z0-9\-]+\/(\d+\/)?$/
这将匹配:

<language of manga>/<manga name> 

那么$/到底做了什么呢?基本上,它告诉正则表达式引擎输入文本需要在该位置结束,输入文本才能匹配。只需删除我提供的链接中的
$
。你会看到它匹配所有四个示例,虽然只是最后两个示例的一部分,但它们仍然是匹配的。这切断了第二个和第三个模式。我只想切断第三个模式。啊,是的,在这种情况下,单字符编辑将解决这个问题。我会做上面的更改。至于@DanielHilgarth的第一篇帖子,它也会匹配:en manga/asd/asd-12/我不确定是否需要,因为你说第二个值需要是一个数字。至于我的答案,它迫使您在字符串的末尾有一个结束反斜杠(正如我认为您的示例所希望的那样)。如果这是一个不需要的行为,您应该使用这个正则表达式:
var MangaIssuePageRegex=/en manga\/[A-Za-z0-9\-]+(\/\d+)(\/)?$/
如果这不是问题,那么我不知道是什么。根据我的测试和重新测试,这个正则表达式只匹配你的前两个例子。你是对的,我的朋友,我不知道为什么当我把你的正则表达式复制到我的代码中时,它第一次不起作用,但我仔细检查了一下,它是完美的
<language of manga>/<manga name>/<issue number> 
var MangaIssuePageRegex = /en-manga\/[A-Za-z0-9\-]+(\/\d+)?(\/)?$/