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