Shell编程之正则表达式总结

Shell编程之正则表达式总结

正则表达式(Regular Expression)是一种文本模式,描述了一种字符串匹配模式。可以用来检查一个串是否包含有某种子串。在Linux的shell编程中广泛运用。正则表达式分为两类:基本正则表达式(Basic Regular Expression)BRE和扩展正则表达式(ExtendedRegular Expression)。

在windows/dos下,如果我们要查找所有的以.doc结尾的文件,我们通常会用通配符*.doc,在这里*会被解释成任意长度的任意字符串。这也可以说是一种匹配模式。和通配符类似,正则表达式就是用来进行文本匹配的工具,只不过比起通配符,正则表达式能更精确的描述你的需求。但是,这也是需要付出更大的代价——更复杂。

         从根本上来看,正则表达式是由两个基本组成部分建立:一般字符和特殊字符。一般字符是指任何没有特殊意义的的字符。特殊字符称为元字符(mete character)。

先来看一些简单的匹配:

metechar :匹配一行上任意位置的8个字母 metechar

^metechar :以metechar开头的行

metechar$ :以metechar结尾的行

[mM]etechar :匹配一行上任意位置的metechar或者Metechar

met.char :匹配一行上任意位置包含有,met加上任意一个字符后面再接上char的,即met+单个字符+char,例如metechar,metachar……都是满足的。

met.*char :匹配一行上任意位置包含有,met加上任意个字符(0个或者n个)后面再接上char的,metammmchar,metachar,metabcdchar都是可以的。

 

一、基本正则表达式

习惯上的把元字符大致分为如下几类:

1.用于匹配单个字符的元字符:

.: 匹配任意的单个字符

[]: 匹配指定范围内的任意的单个字符

扩展:有时候写要匹配0到9之间的数字,可以这样写[0123456789],然而这样写太麻烦了,我们习惯上使用[0-9],同理a到g之间的字母[a-g],a到z之间的字母[a-z]。

[^]: 匹配指定范围外的任意的单个字符

         扩展:字符集合:

[:digit:] 匹配数字

[:lower:] 匹配小写字母

[:upper:] 匹配大写字母

[:space:] 匹配空格

[:alpha:] 匹配大写字母和小写字母

[:alnum:] 匹配大、小写字母和数字

例:

有如下字符:

         abc,abb,abdc,a123b,a1b,aAb,adfghb,abcd,abcabcabcabc,abcdcdcdab

                   a.b:  abb

                   a*b:abc,abb,abdc,a123b,adfghb,abcd,abcabcabcabc,abcdcdcdab

                   a[[:digit:]]b:a1b

2.用于匹配次数的元字符

*: 匹配其前面的字符任意次(包括0次)

扩展:   .*: 任意长度的任意字符

\?: 匹配其前面的字符1次或0次  注:”\”用作转义 !!!其前面的字符可有可无

\{n\} :匹配其前面的字符n次

\{m,n\}:匹配其前面的字符至少m次,至多n次

         扩展:\{m,\} :匹配其前面的字符至少m次

例:

有如下字符:abc,abb,a1b,aAb,abdc,a123b,aabb,adfghb,abcd,abcabcabcabc,abcdcdcdab,accb,accc,ac,accg

         a.*b: abc,abb,a1b,aAb,abdc,a123b,aabb,adfghb,abcd,abcabcabcabc,abcdcdcdab,accb

         a\?b: abc,abb,a1b,aAb,abdc,a123b,aabb,adfghb,abcd,abcabcabcabc,abcdcdcdab,accb

a\{2\}b:aabb

                   ac\{1,3\}:accb,accc,ac,accg

3.用于位置锚定的元字符:

^: 锚定行首,此字符后面的任意内容必须出现在行首

$: 锚定行尾,此字符前面的任意内容必须出现在行尾

^$: 空白行

 

\<或\b: 锚定词首,其后面的任意字符必须作为单词首部出现

\>或\b: 锚定词尾,其前面的任意字符必须作为单词的尾部出现

例:有一个文件内容如下

------test.file------------

Hello,every one!

This is a test file.

The next line is blank line!

 

He is her lover

She is his liker

The test file end!

--------End----------------

         ^T:以 T 开头的行

                   This is a test file.

The next line is blankline!

                   The test file end!

         \.$:以 . 结束的行

                   Thisis a test file.

         <\bl:包含有以  bl  开头的单词的行

                   Thenext line is blank line!

         ne\>:包含有以  ne  结尾的单词的行

Hello,every one!

The next line is blank line!

         <\l.*r\>:包含有以  l 开头且以r结尾的行

He is her lover

She is his liker

 

分组:

\(\)

         前面只提到了怎么重复单个字符(直接在后面加上限定符就好了);但是如果想要重复多个字符串怎么解决?这就要用到我们分组的概念了,用小括号来指定表达式,再来指定重复的次数。

 

例:

ab*  表示 b可以出现任意次

         \(ab\)*   表示ab可以出现任意次

例2:用正则表达式描述一个ip地址

         ((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)

 

后向引用:

使用小括号指定一个子表达式后,匹配这个子表达式的文本(也就是分组捕获的内容)可以在表达式中或其他程序中进一步的处理。默认情况,每个分组默认拥有一个组号。规则是:从左到右,以分组的左括号为标志,第一个出现的分组为1,用\1引用,第二个为2,用\2 引用,以此类推。

         \1:引用第一个左括号以及与之对应的右括号所包括的所有内容

         \2:引用第二个左括号以及与之对应的右括号所包括的所有内容

         \3:以此类推……

 

 

二、扩展正则表达式

扩展正则表达式基本用法与基本正则表达式基本一样,元字符不需要转义

 

1.用于匹配单个字符的元字符:

.: 匹配任意的单个字符

[]: 匹配指定范围内的任意的单个字符

扩展:有时候写要匹配0到9之间的数字,可以这样写[0123456789],然而这样写太麻烦了,我们习惯上使用[0-9],同理a到g之间的字母[a-g],a到z之间的字母[a-z]。

[^]: 匹配指定范围外的任意的单个字符

 

2.用于匹配次数的元字符

*: 匹配其前面的字符任意次(包括0次)

扩展:   .*: 任意长度的任意字符

?: 匹配其前面的字符1次或0次 

{n} :匹配其前面的字符n次

{m,n}:匹配其前面的字符至少m次,至多n次

         扩展:{m,} :匹配其前面的字符至少m次

 

3.用于位置锚定的元字符:

^: 锚定行首,此字符后面的任意内容必须出现在行首

$: 锚定行尾,此字符前面的任意内容必须出现在行尾

^$: 空白行

 

\<或\b: 锚定词首,其后面的任意字符必须作为单词首部出现

\>或\b: 锚定词尾,其前面的任意字符必须作为单词的尾部出现

 

分组:

()

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值