1. 正则语法
1.1 基本元字符
元字符 | 含义 |
---|---|
. | 匹配除换行符以外的任意字符 |
\w | 匹配字母或数字或下划线或汉字 |
\s | 匹配任意空白符 (Space Tab) |
\d | 匹配数字 |
^ | 匹配字符串的开头 |
$ | 匹配字符串的结尾 |
1.2 重复
元字符 | 含义 |
---|---|
* | 零次或更多次 |
+ | 一次或更多次 |
? | 零次或一次 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{n,m} | 重复n到m次 |
1.3 字符集合
当查找字母,数字,空白时,直接使用元字符即可。但如果要匹配特定的字符集,这时就需要字符集合
。
[afox]
匹配afox中任意一个字符
[^afo]
不匹配afo中的任意一个字符
[a-c0-2]
等价于 [abc012]
1.4 分支
类似于C++中的a || b
表达式,a
或 b
任意一个为真,则表达式为真。
0\d{3}|1\d{2}
匹配以0开头的四个数字 或者 以1开头的3个数字。 |
用来表示分支操作。
1.5 分组
分组用于重复匹配。比如IP地址192.168.4.2
, 简单的正则表达式:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}
。可见表达式中重复出现\d{1,3}\.
,此时可以采用分组。(\d{1,3}\.){3}\d{1,3}
。
说白了,就是重构。提取重复代码,构造一个公共函数,进行调用。
1.6 反义
不匹配特定字符。
元字符 | 含义 |
---|---|
\W | 匹配任意不是字母,数字,下划线,汉字的字符 |
\S | 匹配任意非空白字符 |
\D | 匹配任意非数字的字符 |
\B | 匹配任意不是单词开头或结束的位置 |
[^a] | 匹配除a以外的任意字符 |
1.7 后向引用
后向引用: 正则表达式前面匹配一个字符串,在表示的后面部分进一步处理。表达式前面的匹配称为捕获,使用小括号。
the the
---------------------------------------
grep -P "\b(\w+)\b\s+\1\b" --color text
the the
捕获: ()
通过添加小括号,对数据进行捕获。
引用: \1
引用捕获的内容, 1表示第一个小括号捕获的内容,如果有多个捕获,从左到右依次编号。
1.8 零宽断言
用于查找某些内容(但不包含这些内容)之前或者之后的内容。比如singing
, 匹配ing之前的内容sing。
表达式 | 含义 |
---|---|
(?=exp) | 匹配exp前面的位置 |
(?<=exp) | 匹配exp后面的位置 |
singing
singingd
-------------------------------------
grep -P "\b\w+(?=ing\b)" --color text
singing
1.9 贪婪与懒惰
正则表达式很勤快,也称为贪婪,总是最长匹配。例如:a.*b
会匹配字符串axbxxxb
。但如果只想匹配axb
,这时需要懒惰匹配,表达式a.*?b
。
表达式 | 含义 |
---|---|
*? | 重复任意次,但尽可能少 |
+? | 重复1次或更多次,但尽可能少 |
?? | 重复0次或1次,但尽可能少 |
{n,m}? | 重复n到m次,但尽可能少 |
{n,}? | 重复n次以上,但尽可能少 |
2. 正则历史
2.1 PCRE 与 POSIX
2.1.1 PCRE 与 POSIX 区别
正则语法 中所描述的各种使用范例,都是PCRE
(Perl Compatible Regular Expressions)流派的使用方法。而在Unix/Linux 世界中,还存在另一流派,即POSIX
规范。
区别
- POSIX
不支持懒惰匹配
- POSIX
不支持\d
, \D
, \s
, \S
, \w
, \W
- POSIX
不支持零宽断言
字符组
POSIX
虽然不支持\d
, \s
等元字符,但其引入字符组概念。
- [:digit:] 匹配数字,等同
\d
- [:alpha:] 匹配字母,等同
[a-zA-z]
- [:lower:] 匹配小写,等同
[a-z]
- [:upper:] 匹配大写,等同
[A-Z]
- [:space:] 匹配空白,等同
\s
栗子
234 匹配以数字2开头的三个数字
grep -E "2[[:digit:]]{2}" --color text
2e 匹配以数字2开头的非数字
grep -E "2[^[:digit:]]" --color text
后向引用, 匹配 the the
grep "\b\([a-z]\+\)\b\s\+\1" --color text
2.1.2 BRE 与 ERE 区别
POSIX 正则,又分为BRE
(Basic Regular Expressions 与 ERE
(Extended Regular Expressions)两个流派。
-
BRE
元字符?
,+
,{
,|
,(
,)
丢失特殊含义,成为普通字符。使用其特殊含义,需要\
进行转义,即\?
,\+
,\{
,|
,\(
,\)
。 -
BRE
不支持分支。
NOTE: Grep 有4个参数,-G 代表BRE,-E 代表ERE, -F 代表PCRE, -F 普通文本。
2.2 VIM Magic
VIM Magic 设计初衷:更容易的构造正则表达式。支持pcre的元字符\d
,\s
, \w
等。但却没有给+
,?
,()
,{}
赋予特殊含义。这样Vim Magic
模式既有PCRE
语法,又有POSIX
语法,导致字符转义规则比较混乱。
\v
除下划线, 大小写字母,数字外,全为特殊字符
\V
只有\
有特殊含义
case
---------------------
2x23
2x7{2}
2.7{2}
Magic 模式
---------------------
2.\d{2}$ 匹配 2x7{2}
\v 模式
---------------------
2.\d{2}$ 匹配 2x23
\V 模式
---------------------
2.\d{2}$ 匹配 2.7{2}
NOTE:
① 使用vim时,显示使用v
与V
, 避免magic模式的模糊不清。
② vim 中,单词界定符为\<
,\>
。