有些人在碰到问题时,就想:“我知道,我可以使用正则表达式。”现在,他们就有了两个问题。
                                                    ——Jamie Zawinski, 1997年8月

正则表达式(regex)是一些由字符和特殊符号组成的字符串,他们描述了模式的重复或者表述多个字符,于是正则表达式能够按照某种模式匹配一系列有相似特性的字符串。


正则表达式hello world

正则表达式的转义字符为反斜杠\

表达式匹配的字符串
hellohello
worldworld

这个模式没有使用任何特殊符号去匹配其他符号,而只匹配所描述的内容。

1 匹配多个正则表达式

使用|符号可以实现,也可以称作逻辑或或者并

表达式匹配
at|homeat、home
bat|bet|bitbat、bet、bit

2 匹配单个字符

使用点号.可以匹配除了换行符n意外的任何字符

模式匹配
f.ofao、foo、f#o等
..任意两个字符
.end匹配在字符串end之前的任意一个字符

3 从字符串的其实或者结尾匹配

使用^代表起始,$代表结尾

表达式匹配
^From任何以From起始的字符串
/bin/bash$任何以bin/bash作为结尾的字符串
^Subject: hi$匹配所有的Subject: hi

4 创建字符集

通过使用中括号[]可以自定义一个匹配的字符集

表达式匹配
b[aeiu]tbat、bet、bit、but

5 限定范围和否定

通过在中括号[]中使用-连接符可以实现范围,用^可以实现否定

表达式匹配
z.[0-9]z+任意字符+数字
[^aeiou]一个非元音字符
[^\n]不匹配n
["-a]在ASCII中位于34-97之间的

6 使用闭包操作符实现存在性和频数匹配

这部分是最常用的正则表达式符号,也是大家熟知的通配符,即*(0次或多次)、+(1次或多次)和?(0次或1次)

其中还有大括号操作符{}代表匹配前面的正则表达式N次(如果是{N}的话)

表达式匹配
[dn]ot?do、no、dot、not
0?[1-9]任何数字,它可能前置0或者不前置0
[0-9]{15,16}匹配15个数字或者16个数字
</?[^>]+>匹配全部的HTML标签

7 表示字符集的特殊字符

有一些特殊字符可以表示字符集,比如我们可以使用d来实现和0-9一样的效果,使用\w可以表示全部字母和数字的字符集,相当于[A-Za-z0-9_]的缩写形式,另外\s可以来表示空格字符。其中它们的大写版本代表着的含义,例如\D可以表示任何非十进制数

表达式匹配
w+-d+字母数字组成的字符串 - 数字
d{3}-d{4}-d{4}电话号码,如123-4567-7890
w+@w+.com以XXX@YYY.com格式表示的电子邮件地址

8 使用小括号指定分组

小括号可以实现下面任意一个或两个功能:

  • 对正则表达式进行分组
  • 匹配子组

例如当我们使用正则表达式匹配到一段字符串之后,只想取其中的一部分,也可以用到这个来实现

表达式匹配
d+(.d*)?0.004、2、75. 等10进制数字+1个小数点和0个或者多个10进制数字
(Mr?s?\.)?[A-Z][a-z]*[A-Za-z-]+可以包含Mr.、Mrs.、Ms.、M. 的名字和姓氏

9 拓展表示法

拓展表示法以问好开始,通常用于在判断匹配之前提供标记,实现一个前视或者后视匹配,或者条件检查

表达式匹配
(?#comment)不做匹配,仅作为注释
(?=.com)字符串后面跟着.com才做匹配,并且不使用任何目标字符串
(?!.net)后面不跟.net才做匹配
(?<!192\.168\.)不是192.168才做匹配,用于过滤这个开头的IP地址

总结

表示法描述示例
literal匹配文本字符串的字面值foo
re1|re2逻辑或,连接两个正则表达式re1和re2hello|world
.匹配任何单个字符(换行符除外)h.llo
^匹配字符串起始部分(Start With)^Dear
$匹配字符串终止部分(End With)/root/*sh$
*匹配0次或者多次前面出现的正则表达式[0-9]*
+匹配1次或者多次前面出现的正则表达式[a-z]+\.com
?匹配0次或者1次前面出现的正则表达式goo?
{N}匹配N次前面出现的正则表达式[0-9]{3}
{M,N}匹配M~N次前面出现的正则表达式[0-9]{1,3}
[...]匹配来自字符集的任意单一字符(括号里有就匹配)[aeiou]
[..x-y..]匹配x~y范围内的任意单一字符[0-9],[a-zA-Z]
[^...]不匹配括号里面字符集的任何一个字符[^aeiou]
限制符+?将匹配设置为非贪婪模式,尽可能的少匹配.*?[a-z]
(...)括号进行优先级设置([0-9]{3})?,f(oo|u)bar
\d匹配任何10进制数字,和[0-9]一个作用(\D相反,不匹配任何数字)data\d+.txt
\w匹配任何字母+数字,同[a-zA-Z0-9],\W则相反(不匹配)[A-Za-z_]\w+
s匹配任何空格字符,同[\n\t\r\v\f],\S则相反of\sthe

最后奉上一张图片,中间蜂巢一样的空白部分是单个英文字母,如果大家可以将图片中的空白内容填图完毕的话就说明正则表达式成功毕业了!

Last modification:May 22nd, 2021 at 11:15 am