正则表达式是以字符为单位匹配文本(字符串)的模式(pattern)表达式。正则表达式是区分字母大小写的1,它由普通字符(plain text)和元字符2(metacharacter)构成。
其中,一部分元字符可代表某些特定的普通字符的集合(它们统称为:特殊字符元字符),另一部分是正则表达式语法的组成部分(语法关键字)。
可通过一个普通字符、一个字符集或一个(特殊字符)元字符来匹配待查字符串中的某个字符。普通字符仅能匹配与其自身完全相同的字符;字符集3可以匹配与集合中任意一个(普通)字符相同的字符;元字符可以匹配与它所代表的字符集中的任意一个(普通)字符相同的字符。
字符集用一组成对使用的元字符左方括号( [ [ [)和右方括号( ] ] ])来定义,其含义是必须匹配该集合里的字符之一(各个字符之间是 OR 逻辑关系,而不是 AND 关系)。一般来讲,可通过列举出所有可能的普通字符来定义一个字符集,代码如下所示:
# 列举法定义字符集
[Rr]
[ns]
当列举出的普通字符是某个(ASCII码表)字符区间内的连续字符序列时,也可使用元字符 - 以字符区间的方式定义一个字符集,代码如下所示:
# 字符区间法定义字符集
[0-9] # 等效于 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[A-Z] # 等效于 [A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z]
[a-z] # 等效于 [a, b, c, d, e, f, g, h ,i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z]
在字符集内的开头位置(即在左方括号之后,首个普通字符之前)添加元字符 ^,可表示排除字符集合内指定的字符之外的所有字符组成的集合,相当于给定字符集的非逻辑关系。
常用的代表特定字符集的元字符,如下表所示:
元字符 | 说明 |
---|---|
.4 | 可以匹配任意字符(包括其本身) |
[\b] | 退格符(Backspace 键) |
\f | 换页符 |
\n | 换行符 |
\r | 回车符 |
\t | 制表符(Tab 键) |
\v | 垂直制表符 |
\s | 空白字符集,等价于 [\f\n\r\t\v] |
\S | 非空白字符集,等价于 [^\f\n\r\t\v] |
\d | 数字字符集,等价于 [0-9] |
\D | 非数字字符集,等价于 [^0-9] |
\w | 英文字母及数字字符集,等价于 [a-zA-Z0-9_] |
\W | 非英文字母及数字字符集,等价于 [^a-zA-Z0-9_] |
\x | 十六进制数字符集 |
\05 | 八进制数字符集 |
按字符出现顺序,依次排列匹配该(单个)字符的普通字符、字符集或元字符,即可匹配多个连续字符。若有连续重复出现的字符,可通过指定匹配该字符的普通字符、字符集或元字符的重复匹配次数(或次数区间)来实现匹配,不用多次重复书写。
普通字符、字符集或元字符的重复匹配次数由量词元字符指定,量词元字符又可分为“贪婪型”(greedy)量词元字符和“懒惰型”(lazy)量词元字符两种。贪婪型(greedy)元字符会尽可能地从一段文本的开头一直匹配到末尾,而不是碰到第一个匹配时就停止。而懒惰型(lazy)元字符正相反,它匹配尽可能少的字符,当遇到第一个匹配时即停止,可有效避免过度匹配。
常用量词元字符如下表所示:
型元字符 | 说明 |
---|---|
* | 匹配前一个字符(或子表达式)的零次或任意多次重复 |
+ | 匹配前一个字符(或子表达式)的一次或任意多次重复 |
? | 匹配前一个字符(或子表达式)的零次或一次重复 |
{n} | 匹配前一个字符(或子表达式)的 n 次重复 |
{m, n} | 匹配前一个字符(或子表达式)的至少 m 次且至多 n 次重复 |
{n, } | 匹配前一个字符(或子表达式)的至少 n 次重复 |
*? | * 的懒惰型版本 |
+? | + 的懒惰型版本 |
{n, }? | {n, } 的懒惰型版本 |
位置元字符可指定匹配字符在待查字符串中出现的位置,如字符串中某一单词的开头/结尾,或待查字符串的开头或结尾等位置。常见的位置元字符如下表所示:
元字符 | 说明 |
---|---|
\b | 匹配单词的边界(开头和结尾)6,如:匹配以 cat 开头的单词:\bcat ;匹配以 cat 结尾的单词:cat\b ;匹配一个完整的单词7:\bcat\b |
\B | \b 的反义,即匹配单词的内部(非开头和结尾的字符) |
^ | 匹配字符串的开头,需写在正则表达式语句的开头第一个字符位置 |
$ | 匹配字符串的结尾,需写在正则表达式语句的结尾最后一个字符位置 |
其他常用的元字符还有: