1

我有一个 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 应返回以下任何(和类似的派生)的匹配项:

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

4

2 回答 2

3

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

首先,字符串被解释。\w转入w,因为它没有重要意义。
然后,将解析后的字符串转入正则表达式。但是\在字符串解析过程中丢失了,所以你的 RegEx 会中断。

不使用RegExp构造函数,而是使用 RegEx 文字:

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
于 2012-06-29T10:33:20.107 回答
1

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

但是,如果您确实使用了构造函数,则必须记住您的模式被声明为字符串,而不是文字 REGEXP,因此您需要对特殊字符进行双重转义,例如\\d,not \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;
于 2012-06-29T10:38:13.290 回答