正则表达式

正则表达式是一种字符序列描述方法,其特点是高效灵活,相比较传统的字符串搜索和替换,它可以处理动态文本,所以有必要对基本的正则表达式进行掌握。

常用功能

  • 模式匹配:检查一个字符串中是否含有某种字串
  • 替换与抽取:将匹配的子串进行替换或者抽取某种符合条件的子串

基本语法

字符集

在一个正则表达式中,一般会包含多种字符,常见字符及功能如下:

普通字符

普通字符包括没有显式指定为元字符的所有可打印和不可打印字符。这包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号。其中非打印字符如下:

字符 描述
\cx 匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。
\f 换页
\n 回车加换行
\r 回车,回到本行行首
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。注意 Unicode 正则表达式会匹配全角空格符。
\S 匹配任何非空白字符。等价于 \f\n\r\t\v
\t 制表符
\v 垂直制表符

特殊字符

特殊字符即在正则表达式中具有特定语义功能的字符,如果要匹配特殊字符,必须在其之前加\,进行转义,代表将这些字符作为普通字符处理。

限定符

限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配,限定符有六种,分别如下:

字符 描述 举例
* 匹配前面的子表达式零次或多次,贪婪的,会尽可能多匹配 zo* 能匹配 “z” 以及 “zoo”,等价于{0,}
+ 匹配前面的子表达式一次或多次,贪婪的,会尽可能多匹配 ‘zo+’ 能匹配 “zo” 以及 “zoo”,等价于 {1,}
匹配前面的子表达式零次或一次 “do(es)?” 可以匹配 “do” 、 “does” 中的 “does” 、 “doxy” 中的 “do” 。? 等价于 {0,1}
{n} n 是一个非负整数。匹配确定的 n 次。 ‘o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o
{n,} n 是一个非负整数。至少匹配n 次。 ‘o{2,}’ 不能匹配 “Bob” 中的 ‘o’,但能匹配 “foooood” 中的所有 o
{n,m} 最少匹配 n 次且最多匹配 m 次 “o{1,3}” 将匹配 “fooooood” 中的前三个 o

需要注意的是,限定符*和+是贪婪的,即它们会尽可能多地进行匹配,只有在它们后面加上?才能实现非贪婪匹配或最小匹配。

定位符

定位符会定位正则表达式的起始位置,正则表达式中定位符如下

字符 描述 举例
^ 匹配输入字符串开始的位置 /^Chapter [1-9][0-9]{0,1}/,匹配一个章节标题,该标题只包含两个尾随数字,并且出现在行首
$ 匹配输入字符串结尾的位置 /^Chapter [1-9][0-9]{0,1}$/,匹配章节标题,并且改行只有章节标题,没有其他内容
\b 匹配一个单词边界,即字与空格间的位置。 /\bCha/,匹配单词开头三个字母Cha;/ter\b/,匹配单词结尾的三个字母ter
\B 非单词边界匹配 /\Bapt/,该表达式匹配 Chapter 中的字符串 apt,但不匹配 aptitude 中的字符串 apt,因为apt在Chapter中位于非边界位置,在aptitude中位于边界位置

常见匹配模式总结

数字类

匹配指定位数的数字

1
2
3
4
5
6
7
8
^[0-9]{5}$       # 匹配五位数字,且必须以数字开头数字结尾

12345 # 符合
a12345 # 不符合
12345a # 不符合
123454 # 不符合

在上面的解析式中,^和$ 共同限定了长度必须为5位
0%