「正则」/[!-*]/: Range out of order in character class

1,694 阅读1分钟

问题

今天在开发的时候有个需求,需要在正则中添加符号 * ,so easy,ctrl+c,ctrl+v,复制旧的正则,后面加上 *,搞定收工

const reg1 = /^[!-]+$/;
const reg2 = /^[!-*]+$/;

运行后发现,提示 无效的正则表达式,字符集中的范围无序

image.png

大意了啊

image.png

原因

在正则中,字符集。 匹配任何一个包含的字符。您可以使用连字符来指定字符范围,但如果连字符显示为方括号中的第一个或最后一个字符,则它将被视为作为普通字符包含在字符集中的文字连字符。正则组和范围

字符集中,以 ‘-’ 为连接的字符顺序满足 ASCII 的排列规则,前小后大。 所以在代码中,将 [!-*] 作为了匹配 ASCII 值范围在 ! - *的区间,

正则利用ascii编码进行排序,!和 * ,*的ascii编码值小于 !,所以出现了错误

image.png

image.png

后记

大意了啊,写代码还是得多思考🤔

image.png