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?:\/\/.*
(?!.*\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' 不匹配,然后匹配
任意字符 (.
).
这更多是为了满足我的好奇心而不是真正需要帮助的问题,但我同样感谢你的帮助,因为它让我发疯。
我正在尝试使用 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?:\/\/.*
(?!.*\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' 不匹配,然后匹配
任意字符 (.
).