- 正则表达式概念
正则表达式的文法分为3种标准:BRE、ERE 和 ARE。其中 BER 和 ERE 属于 POSIX 标准,ARE 则是由各家定义的扩展
BRE:基本正则表达式
ERE:在BRE基础上,扩展正则表达式
什么是POSIX呢,POSIX Portable Operating System Interface 可移植操作系统接口,(BRE,ERE)的应用。
正则表达式的基本字符匹配:特殊字符(Meta character 元字符)和一般字符。
什么是元字符:特殊意义的专用字符(如"*","+","?","."等),用一个或者一组元字符代替一个或多个字符。举个例子: 元字符*用来匹配0个或多个的前一字符;而元字符. 用来匹配一个任意的一个字符
什么是一般字符:原义正常文本字符(非元字符),例如:'*grep' 匹配所有一个或多个任意字符后紧跟grep,grep就是一般字符。
- 常见linux命令及他们默认使用的正则表达式类型
grep |
sed |
vi |
egrep |
awk |
|
BRE |
* |
* |
* |
||
ERE |
* |
* |
- grep: 加上-E,开启ERE模式
- BRE和ERE 都支持的元字符
字符 |
BRE/ERE |
模式含义 |
^ |
BRE,ERE |
行或字符串的开始;如:'^abcd' 匹配所有以abcd开头的行 |
$ |
BRE,ERE |
行或字符串的结束,如:'abcd$' 匹配以abcd结尾的行 |
. |
BRE,ERE |
匹配一个非换行符的字符 (1); 如:'a.b' 匹配a后接一个任意字符,然后是b,将匹配 aAb,a1b,acb,a@b等 如: '.b' 匹配 ab,1b,@b …等 |
* |
BRE,ERE |
匹配零个或多个正则表达式前面的字符 (0-n) 如:'ac*d' 匹配a后接零个或多个前面的字符,将匹配:ad,acd,accd,acccd …等 注意:星号不能放在首位,星号前面必须有单个字符,经常我们使用 .*表示任意数目字符,但不能直接把星号放在首位如 '*d' |
[…] |
BRE,ERE |
匹配方括号内任意一个字符(1); 如:"[Ab]cde" 匹配Abcd和abcd
如:"[0-9]abc"匹配abc前面的任意一个数字:0abc,1abc,2abc,012abcd,0123abcd …… [a-z] 123 匹配123前面的任意一个小写母如:a123,b123,ab123,abc123 [A-Z] 123 匹配123前面的任意一个大写母如:A123,B123,AB123,ABC123 [a-zA-Z0-9]表示匹配任意一个数字和大小写英文字母; [a-bA-Z0-9!]表示所有的大小写字母,数字和感叹号; 其它的形式有:[A-Z],[AB-Z],[A-YZ],[AB-YZ],[A-DE-Z] 不支持形式有:[A-D-Z],[AB-D-Z],[A-D-YZ] 如果^符号位于方括号的开始,则具有相反含义:不匹配方括号中的任意字符。 如:'[^A-FH-Z]rep' 匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行;或者[^A-Z]rep |
\ |
BRE,ERE |
通常用于关闭其后续字符的特殊意义,恢复其原意。 如:\(...\),这里的括号仅仅表示括号。 |
4. BRE 和ERE支持不同的元字符
字符 |
BRE |
模式含义 |
\(\) |
BRE |
将圆括号之间的模式存储在特殊“保留空间”。最多可以将9个独立的子模式存储在单个模式中。匹配于子模式的文本,可以通过转义序列\1到\9,被重复使用在相同模式里。 如'\(abc\).*\1' 匹配两个abc中间带有任意数目的字符,第二个abc使用\1来引用。最多可以保存9个独立的模式,即从\1到\9; 简单说:将abc放在保留空间,使用\1引用abc; 注意:必须使用 .* \(ab\).*\1 匹配: abab,ab1ab1,ab12ab1,ab123ab1….等 \(ab\).*\1.*\(de\).*\2 匹配ab1ab1def1de1,ab12ab12de12de1….等 |
\n |
BRE |
重复在\内的第n个模式。n为1到9,n是数字. |
x\{m,n\} |
BRE |
匹配x字符出现的次数区间。x\{n\}是指x出现n次;x\{m,\}是指x出现至少m次;x\{m,n\}指x至少出现m次,至多出现n次. 如:ab\{2\}匹配abb;ab\{2,\}表示abb、abbb等。ab\{2,4\}表示abb、abbb和abbbb。 |
x{m,n} |
ERE |
其功能等同于上面的\{n,m\},只是不再写\转义符了。 匹配x字符出现的次数区间。x\{n\}是指x出现n次;x\{m,n\}指x至少出现m次,至多出现n次.
m表示最小值,n表示最大值 如:ab{2}匹配abb;ab{2,}表示abb、abbb等。ab{2,4}表示abb、abbb和abbbb。 |
+ |
ERE |
与*相比,匹配前面正则表达式的一个或多个实例 (1-n) 如:ab+c 匹配abc,abbc,abbbc ….等 |
? |
ERE |
匹配前面正则表达式的零个或一个实例 (0-1) 如:ab?c 匹配ac,abc |
| |
ERE |
匹配|前面或后面的正则表达式 如:'ab|cd'匹配ab,cd,abcd |
() |
ERE |
匹配用括号括起来的正则表达式群; 如:参见11的分组例子 |
- grep 程序支持的元字符plus
字符 |
模式含义 |
\< |
单词的开始,如:'\<ab' 匹配包含以ab开头的单词的行 |
\> |
单词的结束,如:'ab\>'匹配包含以ab结尾的单词的行 如:匹配单词开头+word+结尾 test@sha> echo this is a word. |grep '\<word\>' this is a word. |
\w |
匹配文字和数字字符,也就是[A-Za-z0-9] 如:'G\w*p' 匹配以G后跟零个或多个文字或数字字符,然后是P ;'G\w*p' 匹配 G123456abp |
\W |
\w的反置形式,匹配一个或多个非单词字符,如点号,句号等 如:'G\W*p' 匹配G...:p |
\b |
单词锁定符 如:'\bhello\b'只匹配hello 如:''er\b'' 可以匹配"never" 中的''er'',但不能匹配 "verb"中的 ''er''。 awk使用\y表示此功能 |
\B |
正则表达式之后或者之前不能是空格 如: ''er\B''能匹配"verb"中的''er'',但不能匹配"never"中的 ''er'' (er是结束位置,不能匹配) |
\`\` |
分别匹配缓冲区的开头和结尾。通常视为^和$同义 |
实例:
test@sha>cat aa.regular
aatestaa
west123es123
test@sha>cat bb.regular
bbtestbb
test@sha>cat cc.regular
cctestcc
test@sha>ls -l |grep '\<aa'#列出以aa开头的文件
test@sha>grep 'test' c*#显示以c开头的文件中包含test的行
Cctestcc
test@sha>grep 'test' a* b* c*#显示以a,b,c开头的文件中包含的test的行
aa.regular:aatestaa
bb.regular:bbtestbb
cc.regular:cctestcc
test@sha>grep '[a-z]\{5\}' a* #显示以a开头的文件中,至少有5个连续小写字母的字符串的行
aatestaa
test@sha>grep 'w\(es\)t.*\1' a*#显示以a开头的文件中,包含west并且重复出现过一次es
west123es123
- 特殊字符类 (为了在不同国家的字符编码保持一致)
6.1 POSIX 字符集
模式含义 |
|
[::alnum] |
匹配文本和数字字符,等效于A-Za-z0-9 如:ab[[::alnum]] 匹配abc,ab1 |
[:alpha:] |
匹配文字字符; 如:ab[[:alpha:]] 匹配abc |
[:blank:] |
匹配空格space与定位tab字符 |
[:cntrl:] |
匹配控制字符 |
[:digit:] |
匹配数字字符 |
[:graph:] |
匹配非空格字符 |
[:lower:] |
匹配小写字母字符 |
[:print:] |
匹配非空字符(包括空格) |
[:punct:] |
匹配标点符号字符 |
[:space:] |
匹配空格字符 (新行,空格,制表符) |
[:upper:] |
匹配大写字母字符 |
[:xdigit:] |
匹配16进制数字 |
实例:#匹配一个或多个数字字符或下划线"_"
test@sha>echo this num is 123_456 |grep -E '[[:digit:]_]+'
this num is123_456
test@sha>echo this num is 123456 |grep -E '[[:digit:]_]+'
this num is123456
test@sha>echo this num is _ |grep -E '[[:digit:]_]+'
this num is _
- 此外,还有以下特殊字符类:
perl类 等效POSIX表达式 描述
----------------------------------------------------------------------------
\o [0-7] |
八进制数字 |
\O [^0-7] |
非八进制数字 |
\w [[:alnum:]_] |
单词构成字符 |
\W [^[:alnum:]_] |
非单词构成字符 |
\A [^[:alpha:]] |
非字母 |
\L [^[:lower:]] |
非小写字母 |
\U [^[:upper:]] |
非大写字母 |
\S [^[:space:]] |
非空格符 |
\D [^[:digit:]] |
非数字 |
\X [^[:xdigit:]] |
非十六进制数字 |
\P [^[:print:]] |
非可打印字符 |
- 还可以使用以下特殊字符换码序列:
\r |
回车 |
\n |
换行 |
\b |
退格 |
\t |
制表符 |
\v |
垂直制表符 |
\" |
双引号 |
\' |
单引号 |
6.2 排序符号
多个字符序列视为一个元素,它使用[.和.]将字符组合括起来。例如,[.cn.]就表示cn字符序列,而单独的c或n都不行
6.3 等价字符集
等价字符集表示应视为等值的一族字符,使用[=和=]将字符括起来。例如,e和ê,在法语的local 里,"[[=e=]]" 可能匹配于e/é/è/ê
- 单个字符匹配
7.1 一般字符
7.2 转移Meta字符
例如:\.就真表示一个点;\[左方括号;\\表示反斜杠
7.3 . (点号)字符
".hina"表示"任一字符";很少单独使用,多与其他字符混合匹配多个字符
7.4 方括号表达式
例如:
[cC]hina匹配china 和China;
[^abd]hina匹配除了abd 3个小字母外的任意字母,加上hina.(包括:所有大写字母,数字,标点符号等)
[a-zA-Z0-9]hina, 匹配[a-z],[A-Z],[0-9]加上hina
- 单个表达式匹配多个字符
8.1 星号字符的应用
- ab*c ab和c之间匹配0个或多个字符,即ac,abc,abbbc……
- a.*c a和c之间匹配0个或多个字符,即 ac,adc,accccc …….
- a.c a和c之间匹配单个字符,即 acc,aac,a!c等
8.2 区间表达式的应用
- ab\{3\}c a和c之间的b字母重现3次,即 abbbc
- ab\{3,\}c a和c之间的b重现至少3次,即 abbbc,abbbbc
- ab\{3,5\} a和c之间的b字母重现3次到5次,即abbbc,abbbbc,abbbbbc
- a\{5\} a重现5次
- b\{7,10\} b重现7次到10次
8.3 匹配多个字符实例
- ab?c 即ac和abc
- ab+c 即abc,abbbc…..但是不匹配ac
+字符的概念和*有点相似,但是+字符要求前置正则表达式至少出现一次
- 文本匹配锚点
实例:
字符串: abcxxxABCabcxxxefg
^abc 匹配字符串开头的3个字母abc,例如 abcxxxABCabcxxxefg
^ABC 匹配字符串开头的ABC
efg$ 匹配结尾处的efg ,$表示结尾,即abcxxxABCabcxxxefg
^$ 匹配空的字符串或者空行
- 运算符优先级
BRE运算优先级
- ERE中的运算优先级
运算符 |
含义 |
[..][==][::] |
方括号符号 |
\Meta |
转移的Meta字符 |
[] |
方括号表达式 |
() |
分组 |
*+? {} |
重复前置的正则表达式 |
无符号 |
连续 |
^$ |
锚点 (匹配空行) |
| |
交替 |
11.更多差异 (后向引用,分组,交替)
11.1 后向引用 (BRE)
使用\(和\) 括起想要之后引用的部分,使用\1-\9引用之前选定的部分
例如: \(ab\)\(cd\)[efg]*\1\2
ab被括起来,之后使用\1引用;cd被括起来,之后使用\2引用;
[efg]* 表示:e或f或g,或空;
匹配的一些字符串是: abcdabcd,abcdeabcd,abcdfabcd,abcdgabcd
例如:\(go\).*\1
匹配的一些字符串是: gogo,go1go,go12go,go123go….等
11.2 交替 (ERE)
例如:you|me 匹配you 或者me
11.3 分组 (ERE)
匹配重复情况;如:(go)+匹配一个或者多个连续的go
例子:
man|woman+ 匹配字符串: man,woman,womann,womannn
(man|woman)+ 匹配字符串:man,manman,womanwoman
参考书籍:linux shell 从入门到精通