1

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

我正在尝试使用 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 的行。我曾尝试过像这样臭名昭著的“消极前瞻”:

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

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

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

!www   OR  !http

这本来可以完成这项工作。

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

感谢您的任何回答;)

4

2 回答 2

3

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

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

演示

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

于 2015-01-13T14:37:28.593 回答
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”是否不匹配,然后匹配任何字符 ( .)。

于 2015-01-13T15:05:28.183 回答