正则表达式以匹配URL /网址

时间:2012-06-29 10:30:30

标签: javascript regex

我有一个JS函数,它传递一个运行RegEx的字符串,并返回任何匹配项:

searchText= // some string which may or may not contain URLs
Rxp= new RegExp("([a-zA-Z\d]+://)?(\w+:\w+@)?([a-zA-Z\d.-]+\.[A-Za-z]{2,4})(:\d+)?(/.*)?/ig")
return searchText.match(Rxp);

RegExp应该返回以下任何一个(以及类似的派生词)的匹配:

然而,没有这样的运气。有什么建议吗?

2 个答案:

答案 0 :(得分:3)

在字符串中,\必须转义:\\

首先,解释字符串。 \w转入w,因为它没有重要意义 然后,解析后的字符串在RegEx中打开。但是在字符串解析期间\会丢失,因此您的RegEx会中断。

使用RegEx文字:

,而不是使用RegExp构造函数
Rxp = /([a-zA-Z\d]+:\/\/)?(\w+:\w+@)?([a-zA-Z\d.-]+\.[A-Za-z]{2,4})(:\d+)?(\/.*)?/ig;
// Note: I recommend to use a different variable name. Variables starting with a
//  capital usually indicate a constructor, by convention.

如果您不是100%确定输入是字符串,最好使用exec方法,该方法将参数强制转换为字符串:

return Rxp.exec(searchText);

这是一个包含查询字符串和URL片段的模式:

/([a-zA-Z\d]+:\/\/)?(\w+:\w+@)?([a-zA-Z\d.-]+\.[A-Za-z]{2,4})(:\d+)?(\/[^?#\s]*‌)?(\?[^#\s]*)?(#\S*)?/ig

答案 1 :(得分:1)

首先,没有必要通过RegExp构造函数创建模式,因为它不包含任何动态。您只需使用文字/pattern/即可。

但是,如果您确实使用了构造函数,则必须记住您的模式被声明为字符串,而不是文字REGEXP,因此您需要双重转义特殊字符,例如\\d,而不是\d。此外,有几个正斜线你根本没有逃脱。

使用构造函数,修饰符(g,i)作为第二个参数传递,而不是附加到模式。

所以要真正改变你所拥有的东西,那就是:

Rxp= new RegExp("([a-zA-Z\\d]+:\\/\\/)?(\\w+:\\w+@)?([a-zA-Z\\d.-]+\\.[A-Za-z]{2,4})(:\\d+)?(\\/.*)?", "ig")

但更好的是:

Rxp = /([a-zA-Z\d]+:\/\/)?(\w+:\w+@)?([a-zA-Z\d.-]+\.[A-Za-z]{2,4})(:\d+)?(\/.*)?/gi;