元字符 [ ] \
这一对元字符主要用于指定字符类,也就是你想要匹配的一组字符。
比如:[asd]
就是要匹配任何字符 a, s, d
,但如果想匹配 a b c d e …… x y z
是不是要把所有的都写一遍?当然不是了,这个我们可以写成 [a-z]
就行了,-
就是用来表示一个范围,再比如表示数字 1
至 9
,可以写成 [1-9]
。
上面说的是包含的字符范围,如果想匹配不包含的范围要怎么做?这就要用到元字符 ^
,比如匹配除了 n, u, 3
之外的字符,可以写成 [^nu3]
。
还有一点需要注意,在 [ ]
中的元字符会作为普通字符匹配,比如 [$+]
就会匹配 $, +
。
最后说下元字符 \
,它的意义是用于转义所有元字符,也就是去掉元字符的特殊性,比如 \{\$\\
,其实就是匹配字串 {
, $
, \
。
特殊字符类
上面说了 [a-z]
可以匹配所有小写字母,[0-9]
用来匹配所有数字,这样已经够简单了,还有更简单的几种特殊范围表达方式。
| 字 符 | 说明 |
|:——:|:—–|
| .
| 匹配除 "\n"
之外的任何单个字符。要匹配包括 '\n'
在内的任何字符,请使用象 '[.\n]'
的模式。 |
| \d
| 相当于[0-9]
,即匹配一个数字字符。 |
| \D
| 相当于[^0-9]
,即匹配一个非数字字符。 |
| \s
| 相当于[\f\n\r\t\v]
,也就是匹配任何空白字符,包括空格、制表符、换页符等等。|
| \S
| 相当于[^\f\n\r\t\v]
,匹配任何非空白字符。|
| \w
| 相当于[a-zA-Z0-9_]
,匹配任何字母与数字字符。 |
| \W
| 相当于[^a-zA-Z0-9_]
,匹配任何非字母与数字字符。|
上面这些特殊序列可以包含在字符类中,比如 [\s\d,]
即匹配任何空白字符,数字和 ,
。
重复匹配 * + ?{m,n}
只是做到匹配字符串集合,肯定是不够的,它还有个更大的优势,那就是可以指定某一部分字符是重复的,并且可以指定重复的次数。
先说第一个表示重复的元字符 *
,它用来指定前面一个字符可以重复0
次或者多次。
比如 ap*le
将会匹配 apple
,appple
,ale
等等。
这里当重复正则时,匹配引擎会尝试尽可能多的重复它。当发现模式的后续部分不匹配,则匹配引擎将会回退并以较少的重复次数再次尝试。
另一个重复的元字符 +
,它用来表示前一个字符可重复1次或多次。它跟 *
相比,其实就是少了一个重复0
次,也就是上面 ap*le
换成 ap+le
不会出现匹配到 ale
。
第三个元字符就是 ?
,它用来表示前一个字符可重复0次或1次,把上面的例子换成 ap?le
,其实就是两个字符串 ale
或 aple
。
最后一个复杂些就是 {m,n}
,这个表示前一个字符可重复次数是一个区间,也就是最少重复m
次,最多重复n
次。
例如 ap{2,3}le
将会匹配 apple
,appple
两个字符串,其他都不会匹配。
在这里需要注意下,m
需要小于 n
,当然 m
或 n
也是可以省略的。比如当 m=0
时,可以省略 m
,当 n
为无穷大时,也可以省略 n
。