今天遇到一个问题
'5.4.0a'.match(/[d.]+/)
按照我之前的理解,[]表示里面的任意一个字符的意思,d表示数字,.表示任意单个字符,这样的话,匹配结果应该是'5.4.0a'
but,实践结果是 '5.4.0'
显然这里的.表示的只是. 并没有别的意思,'5.4.0a'.match(/[d.]+/) 测试这句结果也是一样的。
这么看,问题的关键应该是[],
先去看看mdn的解释:
这说明,并不能看出什么特别的含义,于是只好自己多测试了一些demo,and和其他前端小伙伴交流了一下:
'5*4*0a'.match(/[d*]+/) //'5*4*0'
'5^4^0a'.match(/[d^]+/) //'5^4^0'
"
"=="n" //false
"a"==="a" //true
可以总结一下了:
1.对于没有转义含义的字符,在js认为看来 'x'==='x'
2.对于正则[]中的字符:
(1)单个字符(包括元字符.*?^$+等等)表示的就是单个字符,没有其他意义。例外:[^]——开头的^表示非;[a-z]——中间的-表示范围。
(2)加有转义意义的字符(如w d
等)表示的是转义后的字符。
so,反过头看一下最初的问题,'5.4.0a'.match(/[d.]+/)——匹配的是一到多个数字或.,结果自然是'5.4.0'
意外收获:
1.匹配任意字符可以用这个[^](未做充分测试,有兴趣的同学们建议试试)
2.发现了一道我目前找不到答案的题:正则判断一下,一个字符串(如'5*4*0a')里有没有*这种形式的字符?