Linux 正则表达式

  1. 正则表达式概念 

正则表达式的文法分为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就是一般字符。

 

 

  1. 常见linux命令及他们默认使用的正则表达式类型

    

       grep

        sed

           vi

    egrep

       awk

BRE

*

*

*

 

 

ERE

 

 

 

*

*

 

  • grep: 加上-E,开启ERE模式

 

 

  1. 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,被重复使用在相同模式里。

 

如'abcabc.*\1' 匹配两个abc中间带有任意数目的字符,第二个abc使用\1来引用。最多可以保存9个独立的模式,即从\1到\9;  简单说:将abc放在保留空间,使用\1引用abc;

注意:必须使用 .*

 

abab.*\1 匹配: abab,ab1ab1, ab12ab1, ab123ab1….等

abab.*\1.*dede.*\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,\}是指x出现至少m次;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的分组例子

 

  1. 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 'wesest.*\1' a* #显示以a开头的文件中,包含west并且重复出现过一次es

west123es123

 

  1. 特殊字符类 (为了在不同国家的字符编码保持一致)

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/é/è/ê

 

 

  1. 单个字符匹配

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

 

 

  1. 单个表达式匹配多个字符

8.1 星号字符的应用

  • ab*c    ab和c之间匹配0个或多个字符, 即ac,abc,abbc,abbbc……
  • a.*c   a和c之间匹配0个或多个字符 , 即 ac, abc, adc, abbc, accccc …….
  • a.c    a和c之间匹配单个字符, 即 acc, abc, 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, abbc, abbbc…..但是不匹配ac

+字符的概念和*有点相似,但是+字符要求前置正则表达式至少出现一次

 

  1. 文本匹配锚点

 

实例:

字符串:   abcxxxABCabcxxxefg

^abc  匹配字符串开头的3个字母abc, 例如 abcxxxABCabcxxxefg

^ABC 匹配字符串开头的ABC

efg$ 匹配结尾处的efg ,$表示结尾,即abcxxxABCabcxxxefg

^$ 匹配空的字符串或者空行

 

 

  1. 运算符优先级

BRE运算优先级

运算符

含义

[..] [==][::]

方括号符号

\meta

转义的meta字符

[]

方括号表达式

\n

后向应用表达式

*\{\}

区间表达式和星号表达式

无符号

连续

^$

锚点

 

  1. ERE中的运算优先级

运算符

含义

[..][==][::]

方括号符号 

\meta

转移的meta字符

[]

方括号表达式

()

分组

*+? {}

重复前置的正则表达式

无符号

连续

^$

锚点 (匹配空行)

|

交替

 

11.更多差异 (后向引用,分组,交替)

 

11.1 后向引用 (BRE)

使用 括起想要之后引用的部分,使用\1-\9引用之前选定的部分

 

例如: ababcdcd[efg]*\1\2 

ab被括起来,之后使用\1引用;cd被括起来,之后使用\2引用;
[efg]* 表示:e或f或g,或空;

 

匹配的一些字符串是: abcdabcd, abcdeabcd, abcdfabcd, abcdgabcd

 

例如:gogo.*\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,woman, manman,womanwoman

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值