正则表达式,一组具有特定含义的字符串组成,用于匹配和替换文本。
相信大家在学习正则表达式的时候资料也是五花八门的,我一开始也是从linux的一些基础书籍上学的,不是很详细,有很多误区,比如【\d】这个数字匹配,用grep怎么也没有办法匹配数字,今天就来聊一下正则表达式的学习和使用。
首先是为什么grep不能直接匹配【\d】,是因为正则表达式有三大分类。
一、基本正则表达式(Basic Regular Expression,Basic RegEx/BREs)
二、扩展正则表达式(Extended Regular Expression,Extended RgeEx/EREs)
三、Perl的正则表达式(Perl Regular Expression,Perl RegEx/PREs)
grep不加任何参数,只支持BREs,BREs不支持【\d】,PREs支持【\d】,所以需要加参数【-P】,grep要想支持【EREs】需要加【-E】参数(和egrep支持范围一致,egrep要想支持PREs也需要【-P】参数)。其他linux文本工具sed支持BREs和EREs(默认是BREs,【-r】参数支持EREs),awk支持EREs。
以上三类正则匹配分类在支持的正则表达式上有所区别,下表是三类正则匹配常用表达式的支持比较。
字符 |
说明 |
BREs |
EREs |
PREs |
\ |
转义 |
\ |
\ |
\ |
^ |
匹配行首(结合[]的时候有非操作的含义,awk是匹配字符串的开始) |
^ |
^ |
^ |
$ |
匹配行尾(awk匹配字符串结束) |
$ |
$ |
$ |
^$ |
匹配空行 |
^$ |
^$ |
^$ |
^string$ |
匹配行 |
^string$ |
^string$ |
^string$ |
\<string |
匹配string开头的单词,同\bstring |
\<string |
\<string |
不支持,支持\bstring |
string\> |
匹配string结尾的单词,同string\b |
string\> |
string\> |
不支持,支持string\b |
\<string\> |
严格匹配单词,同\bstrinbg\b |
\<string\> |
\<string\> |
不支持,支持\bstring\b |
(regex) |
匹配表达式 |
不支持,不报错 |
(regex) |
(regex) |
? |
匹配前面的子表达式0次或1次,同{0,1} |
不支持 |
? |
? |
\? |
匹配前面的子表达式0次或1次,同\{0,1\} |
\? |
不支持 |
不支持 |
? |
非贪婪模式匹配,在*,+,?和{m,n}后面匹配最少 |
不支持 |
不支持 |
不支持 |
. |
匹配换行符外的任意单个字符(awk中可以匹配换行符) |
. |
. (^$)|(.)可以匹配换行符 |
. (^$)|(.)可以匹配换行符 |
* |
匹配前面的子表达式0次或者多次,同{0,} |
* |
* |
* |
\+ |
匹配前面的子表达式1次或者多次,同\{1,\} |
\+ |
不支持 |
不支持 |
+ |
匹配前面的子表达式1次或者多次,同{1,} |
不支持 |
+ |
+ |
{n} |
匹配前面的子表达式n次,n可以是0 |
不支持(支持\{n\}) |
{n} |
{n} |
{n,} |
匹配前面的子表达式大于等于n次,n可以是0 |
不支持(支持\{n,\}) |
{n,} |
{n,} |
{n,m} |
匹配前面的子表达式n次到m次 |
不支持(支持\{n,m\}) |
{n,m} |
{n,m} |
x|y |
逻辑匹配或,x|y,匹配或者y |
不支持(支持x\|y) |
x|y |
x|y |
[0-9] |
匹配0到9中任意一个数字 |
[0-9] |
[0-9] |
[0-9] |
[xyz] |
字符集合,[]中的元字符被当作普通字符处理 |
[xyz] |
[xyz] |
[xyz] |
[^xyz] |
取反字符集合(awk中匹配的时候会加上换行符) |
[^xyz] |
[^xyz] |
[^xyz] |
[A-Za-z] |
匹配一个大小写字母字符(范围需要递增,顺序不能改) |
[A-Za-z] |
[A-Za-z] |
[A-Za-z] |
[^A-Za-z] |
匹配一个非大小写字符字符(范围需要递增,顺序不能改) |
[^A-Za-z] |
[^A-Za-z] |
[^A-Za-z] |
\d |
匹配0到9中任意一个数字字符,同[0-9] |
不支持 |
不支持 |
\d |
\D |
匹配0到9外任意一个字符,同[^0-9] |
不支持 |
不支持 |
\D |
\s |
匹配任何空白字符,包括空格、制表符、换页符等,同[\f\n\r\t\v] |
不支持 |
不支持 |
\s |
\S |
匹配任何非空白字符,同[^\f\n\r\t\v] |
不支持 |
不支持 |
\S |
\w |
匹配单个下划线、字母和数字字符,同[A-Za-z0-9_] |
\w |
\w |
\w |
\W |
匹配单个非下划线、字幕和数字字符,同[^A-Za-z0-9_] |
\W |
\W |
\W |
\b |
匹配一个单词边界,在单词前面都加,能完全匹配 |
\b |
\b |
\b |
\B |
匹配一个非单词边界,在单词前后都加,能匹配某些长单词的中间字符 |
\B |
\B |
\B |
\t |
横向制表符 |
不支持 |
不支持 |
\t |
\v |
垂直制表符 |
不支持 |
不支持 |
\v |
\n |
换行符 |
不支持 |
不支持 |
\n |
\f |
换页符 |
不支持 |
不支持 |
\f |
\r |
回车符 |
不支持 |
不支持 |
\r |
\\ |
转义符本省 |
\\ |
\\ |
\\ |
\cx |
ctrl+x(例如x为M的时候,ctrl+M/回车) |
不支持 |
不支持 |
\cx |
\xn |
匹配n,n为十六进制转义值,十六进制转义值必须为确定的两个数字长,如\x41匹配A,\x041则等价"\x04"@"1" |
不支持 |
不支持 |
\xn |
\num |
匹配num,其中num是一个正整数,表示对所获取的匹配的引用 |
不支持 |
\num |
|
[:alnum:] |
匹配任何一个字母或者数字,同[A-Za-z0-9],使用时候注意加[],[[:alnum:]] |
[:alnum:] |
[:alnum:] |
[:alnum:] |
[:alpha:] |
匹配任何一个字母,同[A-Za-z] |
[:alpha:] |
[:alpha:] |
[:alpha:] |
[:digit:] |
匹配任何一个数字,同[0-9] |
[:digit:] |
[:digit:] |
[:digit:] |
[:lower:] |
匹配任何一个小写字母,同[a-z] |
[:lower:] |
[:lower:] |
[:lower:] |
[:upper:] |
匹配任何一个大写字母,同[A-Z] |
[:upper:] |
[:upper:] |
[:upper:] |
[:space:] |
匹配任何一个空白字符,制表符和空格等 |
[:space:] |
[:space:] |
[:space:] |
[:blank:] |
匹配空格和制表符 |
[:blank:] |
[:blank:] |
[:blank:] |
[:graph:] |
匹配看的见的可以打印的字符 |
[:graph:] |
[:graph:] |
[:graph:] |
[:print:] |
匹配看的见的可以打印的字符 |
[:print:] |
[:print:] |
[:print:] |
[:cntrl:] |
匹配任何一个控制字符 |
[:cntrl:] |
[:cntrl:] |
[:cntrl:] |
[:punct:] |
匹配任何一个标点符号 |
[:punct:] |
[:punct:] |
[:punct:] |
[:xdigit:] |
匹配任何一个十六进制数 |
[:xdigit:] |
[:xdigit:] |
[:xdigit:] |
上表基本包含了常见正则表达式的内容,断断续续磨了好久才弄完,这两天又搞什么slurm,又写脚本测试的,越发觉得awk,sed的重要性,先学正则还是不错的。以上的内容虽然都实操过了,但是没记录,下一篇再讲讲上面这些字符的分类和实际操作吧。