什么'用这个正则表达式查找URL是错误的

What's wrong with this regular expression to find URLs?

本文关键字:URL 查找 错误 正则表达式 什么      更新时间:2023-09-26

我正在开发一个JavaScript,从谷歌搜索URL中提取URL,如下所示:

http://www.google.com/search?client=safari&rls=en&q=thisisthepartiwanttofind.org&ie=UTF-8&oe=UTF-8

现在,我的代码是这样的:

var checkForURL = /['w'd](.org)/i;
var findTheURL = checkForURL.exec(theURL);

我已经通过几个regex测试人员运行了这个,它似乎可以工作,但在实践中,我返回的字符串看起来是这样的:

thisisthepartiwanttofind.org,.org

那么后面的,.org是从哪里来的呢?

我知道我的模式不是很健壮,但请不要建议使用更好的模式。我真的很想听听关于我在这件事上做错了什么的建议。谢谢

如果不处理.org,请删除正则表达式中的括号(不太可能,因为它是文字)。根据@Mark注释,添加一个+以匹配类['w'd]的一个或多个字符。此外,我会逃离这个点:

var checkForURL = /['w'd]+'.org/i;

您实际得到的是一个由2个结果组成的数组,第一个是整个匹配,第二个是您使用parens(.org)定义的组。

比较:

/([''w''d]+)''.org/.exec('thistheurl.org')→["thissithurl.org","thissisturl"]/[''w''d]+''.org/.exec('thistheurl.org/')→["thisiteurl.org"]/([''w''d]+)(''.org)/.exec('thistheurl.org')→["thisisteurl.org","thisistyurl",".org"]

JS正则表达式的.exec的结果是一个字符串数组,第一个是整个匹配项,然后是您使用parens定义的表示组。如果正则表达式中没有parens,那么这个数组中只有一个元素——整个匹配。

您应该在(.org)正则表达式组中转义.(DOT),或者它匹配任何字符。因此,您的正则表达式将变为:

/['w'd]+('.org)/

为了匹配你的例子中的url,你可以使用这样的东西:

https?://([0-9a-zA-Z_.?=&'-]+/?)+

或者像这样更准确的东西(你应该根据你的需要选择正确的正则表达式):

^https?://([0-9a-zA-Z_'-]+'.)+(com|org|net|WhatEverYouWant)(/[0-9a-zA-Z_'-?=&.]+)$