javascript regexpressions中的确切字符串否定

时间:2015-01-13 14:35:35

标签: javascript regex string regex-negation exact-match

这是一个满足我的好奇心而不是真正需要帮助的问题,但我会同样感谢你的帮助,因为它让我疯狂。

我试图使用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中执行此类操作的正确方法是什么?这取决于正则表达式解析器(我似乎理解?)。

感谢您的回答;)

2 个答案:

答案 0 :(得分:3)

您需要在开始时添加否定前瞻。

^(?!.*\bwww\.)https?:\/\/.*

DEMO

(?!.*\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'是否匹配,然后匹配 任何字符(.)。