请问这两个正则表达式有什么区别

/^([0-9]{1,2}|100)$/和/^[0-9]{1,2}|100$/为什么第一个不能匹配100以上的数字?另外请问若要匹配10-100应该怎么改?

阅读 3.4k
4 个回答

这个问题挺好的,有一个点是关于优先级的问题,具体关于正则可以看我的梳理,里面也提到了优先级的问题

具体来说就是,

第一个正则匹配的是,匹配一个完整字符串从头到结束,其中从头到结束之间的字符内容满足,要么是个位数,要么是2位数,要么是100,接受“前导0”(打引号是因为本质是字符串,不是数字在进行正则匹配)

而第二个正则,没有加括号,由于竖线|优先级低的问题,所以这个表达式本质上类似于/(^[0-9]{1,2})|(100$)/,所以它表示的是匹配这样一个字符串(注意不是完整从头到尾的,只要里面有就可以),要么以一位或者两位数字开头,匹配获取这一位或者两位数字,要么以100结尾,匹配获取100

也就是说你的第二个正则也是没办法完全匹配到100以上的,比如199这个字符串去用第二个做匹配,其实匹配到的是19而不是完整的199,甚至100去匹配也是匹配到10而不是100,因为竖线会短路

至于匹配10到100,无非是改一下最前的那个/^([1-9][0-9]|100)$/

() 是为了提取匹配的字符串,这些字符串可用于向后引用,所匹配的字符会存储在Matches集合里,如果是JavaScript你可以用 $1 属性来提取。

| 相当于程序语言中的“或”。

WOC,这里解释百度百科很细,不说了。

/^(100|[1-9][0-9])$/g

匹配 10-100

let reg = /^[1-9]\d{1}|100$/;
            if( !reg.test(11) )
            {
                console.log('no');
            }else {
                console.log('yes');
            }

之所以不能匹配到100,是因为没有加上全局匹配g。
修改如下:

/^([0-9]{1,2}|100)$/g

这两个的区别就是分组而已,如果获取的正则复制给一个变量,假设为X,在python中可以通过X[1]得到匹配的内容。在JavaScript中,可以通过$1获得。

匹配10-100,可以用以下正则匹配:

/100|([1-9][0-9])/g
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏