昨天,学习了一下JavaScript正则表达式的字符类,当然我们也就知道/\d/匹配的是数字,那么/\d\d/自然匹配的就是两位数了,同理/\d\d\d\d/匹配的就是四位数,可是如果我让你写出匹配8位数的正则表达式,您还真的要写8个\d啊?呵,其实正则表达式允许通过重复来描述具有循环性质的模式。
正则表达式的重复字符:
| 字符 | 含义 |
|---|---|
| {n,m} | 匹配前一项至少n次,但是不能超过m次 |
| {n,} | 匹配前一项n次,或更多次 |
| {n} | 匹配前一项恰好n次 |
| ? | 匹配前一项0次或1次,也就是说前一项是可选的。相当于{0,1} |
| + | 匹配前一项1次或多次,相当于{1,} |
| * | 匹配前一项0次或多次,相当于{0,} |
示例:
//所有十位数,到四位数,包括:0000
var pattern = /\d{2,4}/;
//如下正则内容匹配ab,abc,abcccc
var pattern = /abc*/;
//如下正则内容匹配ab,abbb
var pattern = /ab+/;
注意:在使用重复字符*和?时都要小心,由于 这些字符可能匹配前面字符的0个匹配,所以它们允许什么都不匹配。比如说正则表达式/a*/实际上还与bbbb也是匹配的,因为这个字符里含有0个字母a。
非贪婪的重复:
刚才我介绍的一些重复出神入化都会匹配尽可能多的字符,而且允许接下来的正则表达式继续匹配。因为说上述的重复是“贪婪”的。在JavaScript的正则表达式中,可以以非贪婪的方式进行重复,这本来是Perl5的一个特性,不过被JavaScript给实现了。
定义非贪婪的重复方法:只需要在重复字符后面加问号即可,例如:?? , ?+ , ?*甚至{1,5}?这也是可以的。
举例如下:
正常情况下/a+/匹配一个或多个字符a,将其应用到字符aaa上时,它与三个字母都匹配。但是/a+?/只匹配一个或多个必要的字
母a
例如/a*b/匹配的是一个或多个字母a后面加上一个字母b,其即匹配b,aaab,ab也匹配aab,但是如果将其改为非贪婪的重复时,即/a*b?/它则只匹配b,而不匹配ab,与aaab了。