我有一个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应该返回以下任何一个(以及类似的派生词)的匹配:
然而,没有这样的运气。有什么建议吗?
答案 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;