Welcome toVigges Developer Community-Open, Learning,Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
516 views
in Technique[技术] by (71.8m points)

正则表达式中字符放的位置不一致,匹配结果也不一致?

现象: '-' 字符在正则中位置不同,匹配的结果也不同(预期应该都能匹配上)

代码如下:
第一种位置: 匹配结果是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

查了相关资料, 也没有涉及到字符位置顺序这一块的


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

这是因为字符-在正则表达式的字符集合[]中,可能表示的是元子符,作用是连字符,表示左边字符到右边字符的一个范围,比如[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}$中,由于这里的[.-:]表示的是一个整体,意思是匹配从.:这个范围的任意一个字符,匹配的字符如下:
rr.png
所以这个正则匹配不到字符-

正常情况下,你如果要使[]里面的连字符-失去特殊符号的作用,可以把它放在第一个位置,如[-az],或者转义一下[a-z],这两个正则都是只匹配-az这三个字符中的任意一个。


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to Vigges Developer Community for programmer and developer-Open, Learning and Share
...