这是一个满足我的好奇心而不是真正需要帮助的问题,但我会同样感谢你的帮助,因为它让我疯狂。
我试图使用Javascript正则表达式否定一个确切的字符串,其想法是排除包含字符串" www"的URL。例如这个列表:
http://www.example.org/
http://status.example.org/index.php?datacenter=1
https://status.example.org/index.php?datacenter=2
https://www.example.org/Insights
http://www.example.org/Careers/Job_Opportunities
http://www.example.org/Insights/Press-Releases
为此,我可以成功使用以下正则表达式:
/^http(|s):..[^w]/g
这是正常的,但我可以做一个积极的匹配,我不能做这样的事情:
/[^www]/g or /[^http]/g
排除包含确切字符串www或http的行。我尝试了臭名昭着的负面Lookeahead"那样:
/*(?: (?!www).*)/g
但这不起作用或者我无法在线测试它,它也不适用于Notepad ++。
如果我使用Perl,Grep,Awk或Textwrangler,我会简单地完成:
!www OR !http
这就完成了这项工作。
所以,我的问题显然是:在Javascript中执行此类操作的正确方法是什么?这取决于正则表达式解析器(我似乎理解?)。
感谢您的回答;)
答案 0 :(得分:3)
您需要在开始时添加否定前瞻。
^(?!.*\bwww\.)https?:\/\/.*
(?!.*\bwww\.)
否定前瞻声明我们要匹配的字符串不会包含www.
。 \b
表示在单词字符和非单词字符之间匹配的单词边界。如果没有\b
,正则表达式中的www.
将匹配www.
中的foowww.
答案 1 :(得分:0)
在输入字符串的每个位置否定'www':
var a = [
'http://www.example.org/',
'http://status.example.org/index.php?datacenter=1',
'https://status.example.org/index.php?datacenter=2',
'https://www.example.org/Insights',
'http://www.example.org/Careers/Job_Opportunities',
'http://www.example.org/Insights/Press-Releases'
];
a.filter(function(x){ return /^((?!www).)*$/.test(x); });
所以在每个位置检查'www'是否匹配,然后匹配
任何字符(.
)。