JS函数中正则表达式运行报错 单独测试正常是什么原因?
问题原因
主要是两个常见的JS正则使用错误导致的:
- 字符串构造正则的双重转义问题:使用
new RegExp()传入字符串参数时,字符串本身的\是转义标记,你写的\.、\w、\-这类写法在字符串解析阶段就会丢失\,变成普通字符,甚至触发非法转义语法错误。如果要在最终正则里保留\,字符串中必须写成\\。 - HTML转义实体残留:代码里的
&是HTML场景下&的转义写法,JS字符串不会自动解析这个实体,导致正则错误匹配a、m、p、;组成的序列,而不是你需要的&字符。
修复方案
更推荐直接使用JS正则字面量写法,无需处理双重转义,代码更简洁:
function validURL(str) { var pattern = /^((https?)://)(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\-]*[A-Za-z0-9])(:[0-9]*)?(?:\/[\+~%\/\.\w\-]*)?\??(?:[\-\+=&;%@\/%\.\w]*)#?([\-\+=&;%@\/%\.\w]*)$/i; var isValid = pattern.test(str); return isValid; }
如果一定要用new RegExp()字符串构造写法,需要把所有\替换为\\,同时把&替换为&:
function validURL(str) { var pattern = new RegExp( '^((https?)://)(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\\-]*[a-zA-Z0-9])\\.)*([A-Za-z]|[A-Za-z]'+ '[A-Za-z0-9\\-]*[A-Za-z0-9])(:[0-9]*)?'+ '(?:\\/[\\+~%\\/\\.\\w\\-]*)?\\??(?:[\\-\\+=&;%@\\/%\\.\\w]*)#?'+ '([\\-\\+=&;%@\\/%\\.\\w]*)$',"i" ); var isValid = pattern.test(str); return isValid; }
修复后测试你给出的示例URLhttps://www.xml.com/pub/a/2003/09/17/stax.html#id=_abc会正常返回true。
内容的提问来源于stack exchange,提问作者MaxPody
相关产品推荐
相关产品推荐

