文章更新于:2020-05-08
一、语法格式
1.1、非打印字符
操作符 | 说明 | 实例 |
---|---|---|
\cx | 匹配由x指明的控制字符 | \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。 |
\f | 匹配一个换页符 | 等价于 \x0c 和 \cL |
\n | 匹配一个换行符 | 等价于 \x0a 和 \cJ |
\r | 匹配一个回车符 | 等价于 \x0d 和 \cM |
\s | 匹配任何空白字符 包括空格、制表符、换页符等等 | 等价于 [ \f\n\r\t\v] |
\S | 匹配任何非空白字符 | 等价于 [^ \f\n\r\t\v] |
\t | 匹配一个制表符 | 等价于 \x09 和 \cI |
\v | 匹配一个垂直制表符 | 等价于 \x0b 和 \cK |
1.2、特殊字符
操作符 | 说明 | 实例 |
---|---|---|
. | 表达任何单个字符 | |
[ ] | 字符集,对单个字符给出取值范围 | [abc] 表示 a、b、c,[a-z] 表示 a-z单个字符 |
[^ ] | 非字符集,对单个字符给出排除范围 | [^abc] 表示非a、b、c 的单个字符 |
* | 前一个字符 0 次或无限次扩展 | abc* 表示 ab、abc、abcc、abccc 等 |
+ | 前一个字符 1 次或无限次扩展 | abc+ 表示 abc、abcc、abccc等 |
? | 前一个字符 0 次或 1 次扩展 | abc? 表示 ab、abc |
| | 左边表达式任意一个 | abc|def 表示 abc、def |
^ | 匹配字符串开头 | ^abc 表示 abc 且在一个字符串的开头 |
$ | 匹配字符串结尾 | abc$ 表示 abc 且在一个字符串的结尾如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 '\n' 或 '\r' |
( ) | 分组标记,内部只能使用 | 操作符 | (abc) 表示abc,(abc|def) 表示 abc、def |
\d | 数字 | 等价于[0-9] |
\w | 单词字符 | 等价于 [A-Za-z0-9] |
\b | 匹配一个单词边界,也就是指单词和空格间的位置。 | 例如, er\b 可以匹配 never 中的 er ,但不能匹配 verb 中的er 。 |
\B | 匹配非单词边界。er\B 能匹配 verb 中的 er ,但不能匹配 never 中的 er 。 | |
\d | 匹配一个数字字符。 | 等价于 [0-9] |
\D | 匹配一个非数字字符。 | 等价于 [^0-9] |
\f | 匹配一个换页符。 | 等价于 \x0c 和\cL |
\n | 匹配一个换行符。 | 等价于 \x0a 和 \cJ |
\r | 匹配一个回车符。 | 等价于 \x0d 和 \cM |
\s | 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [\f\n\r\t\v] | |
\S | 匹配任何非空白字符。等价于 [^\f\n\r\t\v] | |
\t | 匹配一个制表符。等价于 \x09 和 \cI | |
\ | 匹配一个垂直制表符。 | 等价于 \x0b 和 \cK 。 |
\w | 匹配包括下划线的任何单词字符。等价于[A-Za-z0-9_] | |
\W | 匹配任何非单词字符。等价于 [^A-Za-z0-9_] | |
\xn | 匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,’\x41’ 匹配 “A”。’\x041’ 则等价于 ‘\x04’ & “1”。正则表达式中可以使用 ASCII 编码。. | |
\num | 匹配 num ,其中 num 是一个正整数。对所获取的匹配的引用。 | 例如,(.)\1 匹配两个连续的相同字符。 |
\n | 标识一个八进制转义值或一个向后引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为向后引用。否则,如果 n 为八进制数字 (0-7) ,则 n 为一个八进制转义值。 | |
\nm | 标识一个八进制转义值或一个向后引用。如果 \nm 之前至少有 nm 个获得子表达式,则 nm 为向后引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7) ,则 \nm 将匹配八进制转义值 nm 。 | |
\nml | 如果 n 为八进制数字 (0-3) ,且 m 和 l 均为八进制数字 (0-7) ,则匹配八进制转义值 nml | |
\un | 匹配 n ,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。 | 例如, \u00A9 匹配版权符号 © |
1.3、限定符
限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有
*
或+
或?
或{n}
或{n,}
或{n,m}
共6种。
*
、
+
和?
限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个 `? 就可以实现非贪婪或最小匹配。
操作符 | 说明 | 实例 |
---|---|---|
{m} | 扩展前一个字符 m 次 | ab{2}c 表示 abbc |
{m,} | 扩展前一个字符至少m 次 | ab{2,}c 表示 abbc、abbbc、abbbbc等 |
{m,n} | 扩展前一个字符 m 至 n 次(含 n) | ab{1,3}c 表示 abc、abcc |
1.4、各个操作符的优先级
注:相同优先级的从左到右进行运算,不同优先级的运算先高后低。各种操作符的优先级从高到低如下:
操作符 | 描述 |
---|---|
\ | 转义符 |
() , (?:) , (?=) ,[] | 圆括号和方括号 |
* ,+ ,? ,{n} ,{n,} , {n,m} | 限定符 |
^ , $ , \anymetacharacter | 位置和顺序 |
| | “或”操作 |
1.5、其他说明
操作符 | 描述 |
---|---|
(pattern) | 匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到。 在VBScript 中使用 SubMatches 集合, 在JScript 中则使用 $0…$9 属性。 要匹配圆括号字符,请使用 ‘(’ 或 ‘)’。 |
(?:pattern) | 匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。 这在使用 “或” 字符 (|) 来组合一个模式的各个部分是很有用。例如, industr(?:y|ies) 就是一个比industry|industries 更简略的表达式。 |
(?=pattern) | 正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配。 也就是说,该匹配不需要获取供以后使用。 例如, Windows(?=95|98|NT|2000) 能匹配 Windows 2000" 中的 "Windows ,但不能匹配 Windows 3.1" 中的 "Windows 。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索, 而不是从包含预查的字符之后开始。 |
(?!pattern) | 负向预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配。 也就是说,该匹配不需要获取供以后使用。例如 Windows (?!95|98|NT|2000) 能匹配 Windows 3.1 中的 Windows ,但不能匹配 Windows 2000 中的 Windows 。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始 |
x|y | 匹配 x 或 y。例如,z|food 能匹配 z 或 food 。(z|f)ood 则匹配 zood 或 food |
二、实战演练
2.1、使用案例
语法 | 描述 |
---|---|
^[A-Za-z]+$ | 由 26 个字母组成的字符串 |
^[A-Za-z0-9]+$ | 由 26 个字母和数字组成的字符串 |
^-?\d+$ | 整数形式的字符串 |
^[0-9]*[19][0-9]*$ | 正整数形式的字符串 |
[1-9]\d{5} | 中国境内的邮政编码,6位 |
[\u4e00-\u9fa5] | 匹配中文字符 |
\d{3}-\d{8}|\d{4|-\d{7} | 国内电话号码,010-12345678 |
2.2、在 Linux 系统中的使用
格式:grep [选项] 模式 文件
1、输入不光可以是文件,还可以是标准输入(键盘)、管道(|竖线)
2、先模式再文件,顺序不要弄错
3、如果匹配模式有空格,必须使用引号
参数 | 描述 |
---|---|
-E | 拓展的正则表达式,-E = egrep |
-i | 忽略大小写 |
-w | 当做词来查找,相当于正则里面的 \<...\> |
-x | 被匹配到的内容是整个行,相当于正则 ^...$ |
-v | 取反,就是匹配到的不输出 |
-c | 统计,统计结果的行数(不是结果的次数,可能一行有两个及以上结果) |
m | 行号,显示在原内容中的行号 |
-o | 只显示匹配到的内容,默认显示匹配到的行 |
-R | 递归匹配,比如匹配一个目录中多个文件或目录 |
-B | 同时输出匹配行的前几行 |
-A | 同时输出匹配行的后几行 |
-C | 相当于同时 -B -A |
三、Re库的使用
3.1、Re库的基本函数
函数 | 说明 |
---|---|
re.search() | 在一个字符串中搜索匹配正则的第一个位置,返回 match 对象 |
re.match() | 从一个字符串的开始位置起匹配正则,返回 match 对象 |
re.findall() | 搜索字符串,以列表形式返回全部能匹配的子串 |
re.split() | 将一个字符串按正则匹配结果进行分割,返回列表类型 |
re.finditer() | 搜索字符串,饭后一个匹配结果的迭代类型,每个迭代元素是 match 对象 |
re.sub() | 在一个字符串中替换所有匹配正则表达式的子串,返回替换后的字符串 |
3.2、实战演练使用函数
语法格式 re.search(pattern, string, flags=0)
其中 flags 是正则表达式使用时的控制标记,常用的比如:
常用标记 | 说明 |
---|---|
re.I re.IGNORECASE | 忽略正则表达式中的大小写,[A-Z] 能匹配到小写字符 |
re.M re.MULTILINE | 正则表达式中的^ 操作符能够将给定字符串的每行当做匹配开始 |
re.S re.DOTALL | 正则表达式中的. 操作符能够匹配所有重复,默认匹配除换行外的所有字符 |
四、Enjoy!
注1:推荐两个正则在线练习网站
注2:英文可在线练习:Online regex tester and debugger
注3:正则表达式可视化:https://regexper.com/