javascript 正则表达式中的精确字符串否定

Exact string negation in javascript regexpressions

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

我正在尝试使用 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 的行。我试过臭名昭著的 "negative Lookeahead" 这样的:

/*(?: (?!www).*)/g 

但这也不起作用或者我无法在线测试它,它在 Notepad++ 中也不起作用。

如果我使用 Perl、Grep、Awk 或 Textwrangler,我会简单地这样做:

!www   OR  !http

这样就可以完成工作了。

所以,我的问题显然是:在 Javascript 中做这种事情的正确方法是什么?这是否取决于正则表达式解析器(正如我似乎理解的那样?)。

感谢您的回答 ;)

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

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

DEMO

(?!.*\bwww\.) Negative lookahead 断言我们要匹配的字符串不包含 www.\b表示匹配单词字符和非单词字符的单词边界。如果没有 \b,您的正则表达式中的 www. 将匹配 foowww.

中的 www.

要在输入字符串的每个位置取反 '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' 不匹配,然后匹配 任意字符 (.).