两个正则表达式的组合
Combining two regular expressions
我有一个关于在正则表达式中完成某些事情的问题,即是否可能,如果可能,如何实现。
我正在做的事情的简要简介:我在网上读《曼加》。我喜欢在一个新的选项卡中打开当前问题,但我不总是记得用鼠标中键单击链接。
所以我决定写一个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/
- 组合angularjs表单字段的两个正则表达式
- 在 JS 中组合两个正则表达式
- 在 JavaScript 中组合正则表达式
- 用于在组合文件中查找 AMD 定义呼叫的正则表达式
- 如何在字符串上组合JS replace()方法中的3个正则表达式模式
- 两个正则表达式的组合
- 如何组合以下正则表达式
- 正则表达式“gi”修饰符的组合不适用于单个单词
- 将两个正则表达式组合在一起
- 两个正则表达式的组合
- 组合2个正则表达式,其中一个使用OR运算符进行精确匹配
- 如何创建正则表达式javascript函数来匹配特定的字符串组合
- 将正则表达式组合为空格和换行符
- 正在尝试组合exlude和include正则表达式
- 在Javascript中组合正则表达式
- 在OR中将正则表达式组合在一起
- 用于字符串组合和序列规则的正则表达式角2
- 使用or组合两个正则表达式条件
- 用于字母/数字组合的正则表达式
- 正则表达式 - 组合正则表达式 - 字符串的开头和结尾