这是因为字符-
在正则表达式的字符集合[]
中,可能表示的是元子符,作用是连字符,表示左边字符到右边字符的一个范围,比如[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
这三个字符中的任意一个。
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…