正则表达式理解起来很多时候没有规律可言,因此本文将正则方面的知识总结为死记部分和理解部分。其中死记部分内容较少,大家不用追求理解,只管硬背住就行。理解部分内容较多,大家结合理解进行记忆。
+
:代表前面的字符必须至少出现一次(1次或多次)
*
:代表字符可以不出现,也可以出现一次或者多次(0次、或1次、或多次)
?
:问号代表前面的字符最多只可以出现一次(0次、或1次)
()
:标记一个子表达式的开始和结束位置
[]
: 标记一个范围表达式,
{}
:标记限定符表达式,作用同+
*
?
,限定前面字符出现次数
^
:匹配输入字符串的开始位置
$
:匹配输入字符串的结尾位置
.
:匹配除换行符 \n
之外的任何单字符
|
:指明两项之间的一个选择
要匹配特殊字符需要使用 \
转义
正则表达式一般由三个部分组成,即:
位置+范围+数量+位置
{n}
:n 是一个非负整数。匹配确定的 n 次。例如,‘o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。
{n,}
:n 是一个非负整数。至少匹配n 次。例如,‘o{2,}’ 不能匹配 “Bob” 中的 ‘o’,但能匹配 “foooood” 中的所有 o。‘o{1,}’ 等价于 ‘o+’。‘o{0,}’ 则等价于 ‘o*’。
{n,m}
:m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,“o{1,3}” 将匹配 “fooooood” 中的前三个 o。‘o{0,1}’ 等价于 ‘o?’。请注意在逗号和两个数之间不能有空格。
*
、+
限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个?
就可以实现非贪婪或最小匹配。
对字符串 “a123z456z” 进行匹配
/a.*z/
贪婪:匹配从最开始的 a 到最后的 z 之间的所有内容:
a123z456z
/a.*?z/
非贪婪:只匹配开始的 a 到第一个 z 之间的所有内容:
a123z456z
定位符用来描述字符串或单词的边界,^
和 $
分别指字符串的开始与结束,\b
描述单词的前或后边界,\B
表示非单词边界。
对 “Chapter aAbB” 中的单词 ''Chapter" 进行匹配
/\bCha/
:在单词的开始处查找匹配项
/ter\b/
:在单词的结尾处查找匹配项
/\Bapt/
:匹配 Chapter 中的字符串 apt,但不匹配 aptitude 中的字符串 apt
正则提供一个元字符中括号 []
来表示区间条件。
限定0到9 可以写成[0-9]
限定A-Z 写成[A-Z]
限定某些数字 [165]
普通字符是指字母、数字、标点,以及不可见字符(如\n
,\r
,\t
等)
\d
:任意单个数字,等价于 [0-9]
\D
:任意单个非数字,等价于 [^0-9]
\s
:任意单个空白符,等价于[ \f\n\r\t\v]
\S
:任意单个非空白符,等价于[^A-Za-z0-9_]
\w
:任意单个字母数字和_,等价于[A-Za-z0-9_]
,(\w
有可能匹配到非英文字符,详见正则表达式\w并不完全等于[A-Za-z0-9])
\W
:任意单个非字母数字和_,等价于[^A-Za-z0-9_]
[:alnum:]
:任意单个字母或数字,等价于[A-Za-z0-9]
[:alpha:]
:任意单字母,等价于[A-Za-z]
[:digit:]
:任意单个数字,等价于[0-9]
[:lower:]
:任意单个小写字母,等价于[a-z]
[:upper:]
:任意单个大写字母,等价于[A-Z]
[:space:]
:任意单个空白字符:制表符、空格
正则表达式分类:
不同命令和不同编程语言中使用的正则表达式很可能不是同一类,其中使用较多的是扩展正则表达式和 Perl 正则表达式。
此外,Linux 系统命令主要使用扩展正则,而 Python 使用 Perl 正则,因此这两者的正则表达式有时候不通用。
详细区别可见:linux shell 正则表达式(BREs,EREs,PREs)差异比较
注意:
sed
:支持基本正则。sed -r
:支持扩展正则。
grep
:支持基本正则。egrep / grep -E
:支持扩展正则。egrep -P / grep -P
:支持 Perl 正则。
awk
:支持扩展正则。
由于基本正则与另外两种正则的写法差异较大,建议避免使用基本正则表达式。
扩展正则和 Perl 正则简略区别如下:
扩展正则仅支持:\w
,\W
,不支持:\d
,\D
,\s
,\S
,\t
,\n
,\r
等。
正则表达式 - 教程