正则表达式的简单用法

220 阅读2分钟

在我们写代码的过程中,经常会有查找符合某些复杂规则的字符串的需要,而正则表达式就是用于描述这些规则的工具,通过它强大的语法格式,可以帮我们处理大量的字符串匹配的问题,下面简要总结一下正则表达式的一些常用语法。

1.元字符

元字符就是指那些在正则表达式中具有特殊意义的专用字符,常用的元字符如下表所示:

字符描述
.匹配除换行符以外的任意字符
\w匹配字母或数字或下划线或汉字
\W匹配非字母、数字、下划线、汉字
\s匹配任意的空白符
\S匹配任意非空白符
\d匹配数字
\D匹配任意非数字字符
\b匹配单词的开始或结束
\B匹配非单词边界
匹配字符串的开始
$匹配字符串的结束

2.限定符

限定符指定在输入字符串中必须存在上一个元素(可以是字符、组或字符类)的多少个实例才能出现匹配项,常用的限定符如下所示,类似的+?这样的限定符表示尽可能少重复,是因为在正则表达式中默认会匹配尽可能长的字符串,例如a.*b,它将会匹配最长的以a开始,以b结束的字符串,如果匹配aabab的话,就会匹配整个字符串aabab,而如果是a.*?b,就会匹配aab。

字符描述
*匹配上一个元素零次或多次
+匹配上一个元素一次或多次
?匹配上一个元素零次或一次
{n}匹配上一个元素n次
{n,}匹配上一个元素至少n次
{n,m}匹配上一个元素至少n次,但不多于m次
*?重复任意次,但尽量少重复
+?重复1次或更多次,但尽可能少重复
??重复0次或1次,但尽可能少重复
{n,m}?重复n到m次,但尽可能少重复
{n,}?重复n次以上,但尽可能少重复

3.字符类

\d可以表示数字类,但有时候我们需要自定义匹配一些内容,例如匹配"abc"中的任意一个,就可以使用[abc],匹配a-z中的任意一个,就可以使用[a-z],常用的字符类标识如下:

字符描述
[xyz]匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "play" 中的 'a'。
[^xyz]匹配未包含的任意字符
[a-z]匹配指定范围的任意字符
[^a-z]匹配不在指定范围内的任意字符
x|y匹配x或y

4.分组

使用圆括号()可以表示一个分组,可以将分组内的内容作为一个整体进行重复匹配,例如"(\sabc)+"可以对" abc"进行一次以上的匹配,同时还可以对圆括号中的内容进行捕获,当有多个圆括号时,从左边的第一个左括号(算起,默认依次分组为第一个捕获组、第二个捕获组……,通过这样的设定可以实现后向引用,\n可以代表分组n匹配的文本,例如\1代表分组1匹配的文本,\b(\w+)\b\s+\1\b就可以用来匹配重复的单词,像go go、quick quick。

5.零宽断言

零宽断言是用来匹配不包括本身的内容但是从本身内容的位置开始匹配后面或者前面的内容,它会占据一个开始匹配的位置,却又不会消耗这个位置,因为它并不匹配自身的内容,这样形容会比较迷惑,如下例所示:

1.(?=exp),也叫零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp,比如\b\w+(?=ing\b),匹配以ing结尾的单词的前面部分,并不包括ing的内容,如查找I'm singing while you're dancing.时,它会匹配sing和danc。

2.(?<=exp),也叫零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式exp。比如(?<=\bre)\w+\b会匹配以re开头的单词的后半部分,并不包括re的内容,例如在查找reading a book时,它匹配ading。

如果你想要给一个很长的数字中每三位间加一个逗号(注意是从右边开始),就可以这样查找需要在前面和里面添加逗号的部分:((?<=\d)\d{3})+\b,用它对1234567890进行查找时结果是234567890,说明可以在1后面添加一个逗号,然后再对234567890进行查找,结果是567890……

使用这两种断言:(?<=\s)\d+(?=\s)匹配以空白符间隔的数字,注意并不包括空白符。

6.运算符优先级

在正则表达式中,相同级别的优先级按从左往右的顺序进行运算,不同级别的运算级则按从高到低的顺序进行运算,按优先级从高到低排列的运算符如下表所示:

运算符描述
\转义符
(), (?:), (?=), []圆括号和方括号
*, +, ?, {n}, {n,}, {n,m}限定符
^, $, \任何元字符、任何字符定位点和序列(即:位置和顺序)
替换,"或"操作

7.其他

使用 \ 可以表示转义,例如 * 在正则表达式中表示任意次的意思,但是如果需要匹配的字符串内本身就有该字符,那么就可以使用 \* 将其作为普通字符对待。

使用 | 可以表示不同的分支条件,表示更多的匹配规则,例如 0\d{2}-\d{8}|0\d{3}-\d{7}这个表达式能匹配两种以连字号分隔的电话号码,一种是三位区号,8位本地号,如010-12345678,一种是4位区号,7位本地号,如0376-2233445。

参考文章:

微软正则表达式

正则表达式30分钟入门教程