如何在JavaScript的RegExp对象中使用带长度限制的正则表达式
错误原因
你遇到的SyntaxError是因为JavaScript正则引擎不支持{m,n}+格式的占有量词,你之前能正常运行的正则编译器大概率遵循PCRE正则规范,和JS的ECMAScript正则标准存在语法差异。
你写的{1,4}+里的末尾+属于占有量词语法,在JS中会被识别为重复运算符但前置没有可匹配的单元,因此抛出Nothing to repeat报错。
修复方案
直接删除所有{1,4}后面多余的+即可,{1,4}本身就已经实现了「匹配1-4位十六进制字符」的长度限制逻辑,不需要额外加+。
修复后代码
// 移除所有{1,4}后的非法+符号 const ipv6="([a-zA-Z0-9]{1,4}):([a-zA-Z0-9]{1,4}):([a-zA-Z0-9]{1,4}):([a-zA-Z0-9]{1,4}):([a-zA-Z0-9]{1,4}):([a-zA-Z0-9]{1,4}):([a-zA-Z0-9]{1,4}):([a-zA-Z0-9]{1,4})"; const regex = new RegExp(ipv6); const result = SAMPLE_STRING.match(regex); console.log(result);
如果需要匹配完整的IPv6字符串而非提取子串,可以在正则首尾补充起止标识符:
const ipv6="^([a-zA-Z0-9]{1,4}):([a-zA-Z0-9]{1,4}):([a-zA-Z0-9]{1,4}):([a-zA-Z0-9]{1,4}):([a-zA-Z0-9]{1,4}):([a-zA-Z0-9]{1,4}):([a-zA-Z0-9]{1,4}):([a-zA-Z0-9]{1,4})$";
补充说明
当前正则仅能匹配未做::压缩的全写IPv6地址,如果需要匹配含压缩段的标准IPv6地址,还需要补充对零压缩规则的适配逻辑。
内容的提问来源于stack exchange,提问作者TIRANO
相关产品推荐
相关产品推荐

