现象: '-' 字符在正则中位置不同,匹配的结果也不同(预期应该都能匹配上)
代码如下:
第一种位置: 匹配结果是false
const reg = /^[\w\.-:\u4e00-\u9fa5]{1,128}$/g;
reg.test('-'); // console: false
第二种位置: 匹配结果是true
const reg1 = /^[\w-\.:\u4e00-\u9fa5]{1,128}$/g;
reg1.test('-'); // console: true
查了相关资料, 也没有涉及到字符位置顺序这一块的
这是因为字符
-
在正则表达式的字符集合[]
中,可能表示的是元子符,作用是连字符,表示左边字符到右边字符的一个范围,比如[0-9]
等价于[0123456789]
,这里的-
表示的就是一个连字符的意思。在你的例子
/^[\w-.:\u4e00-\u9fa5]{1,128}$/g
中,由于\w
表示的是一个字符集合,表示单词字符集合,在ASCII码的环境下,等价于[0-9a-zA-Z_]
,因此,你的[\w-.:\u4e00-\u9fa5]
也就等价于[_0-9a-zA-Z-.:\u4e00-\u9fa5]
,由于这里的-
前面的Z已经和A配对成一个整体A-Z
了,所以-
的左边没有可以用来组合成一个表示范围的整体了,就只表示了自己本来的意思,只表示一个普通的字符-。所以这里的^[\w-.:\u4e00-\u9fa5]{1,128}$
会匹配字符串-
。而在你的正则

^[\w.-:\u4e00-\u9fa5]{1,128}$
中,由于这里的[.-:]
表示的是一个整体,意思是匹配从.
到:
这个范围的任意一个字符,匹配的字符如下:所以这个正则匹配不到字符
-
正常情况下,你如果要使
[]
里面的连字符-
失去特殊符号的作用,可以把它放在第一个位置,如[-az]
,或者转义一下[a\-z]
,这两个正则都是只匹配-
、a
、z
这三个字符中的任意一个。