首页 > 代码库 > 正则表达式

正则表达式

1.1什么是正则表达式?

  正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

  正则表达式种类:

  BRE(基础正则表达式)  ^ $ . [] * 其他字符识别为普通字符;

  ERE(扩展正则表达式) () {} + |等。

1.2Linux正则表达式是用来干什么的。

  linux中是用来查找文本的内容,通过正则表达式和awk.grep.sed等来快速显示替换文件内容。

1.3Linux正则表达式特点。

  1. 灵活性、逻辑性和功能性非常的强;

  2. 可以迅速地用极简单的方式达到字符串的复杂控制。

  3. 对于刚接触的人来说,比较晦涩难懂。

1.4Linux正则表达式学习前准备。

  为方便学习正则表达式可进行别名修改,让搜索出来的内容显示颜色。

[root@oldboy36 ~]# alias  egrep=‘egrep--color=auto‘

[root@oldboy36 ~]# alias  grep=‘grep--color=auto‘

[root@oldboy36 ~]# cat  >>etc/profile<<EOF

> alias egrep=‘egrep--color=auto‘

> alias grep=‘grep--color=auto‘

> EOF

[root@oldboy36 ~]# source  /etc/profile

[root@oldboy36 ~]#

1.5Linux正则表达式学习前准备。

字符

描述

^尖角号

^word 找以word开头的

[root@oldboy36 data]# grep "^m"  oldboy.txt

my blog is http://oldboy.blog.51cto.com

my qq num is 49000448.

my god ,i am not oldbey,but OLDBOY!

[root@oldboy36 data]#

$

word$ 查找以word的结尾的

[root@oldboy36 data]# grep "m$"  oldboy.txt

my blog is http://oldboy.blog.51cto.com

[root@oldboy36 data]#

^$

表示空行,不是空格

[root@oldboy36 data]# grep -n "^$"  oldboy.txt

3:

8:

11:

[root@oldboy36 data]#

.(点)

代表且只能代表任意一个字符/文本/符号(不匹配空行)

[root@oldboy36  data]# grep "." oldboy.txt  .显示了所有内容空格可以找到但是空行不可以找到
 
I am oldboy teacher!
 
I teach linux.
 
I like badminton ball  ,billiard ball and chinese chess!
 
my blog is  http://oldboy.blog.51cto.com
 
our site is http://www.etiantian.org
 
my qq num is 49000448.
 
not 4900000448.
 
my god ,i am not  oldbey,but OLDBOY!
 
[root@oldboy36 data]#

[root@oldboy36  data]# grep "ol.boy" oldboy.txt
 
I am oldboy teacher!
 
my blog is http://oldboy.blog.51cto.com
 
[root@oldboy36 data]#  grep "ol.*" oldboy.txt
 
I am oldboy teacher!
 
my blog is http://oldboy.blog.51cto.com
 
my god ,i am not oldbey,but OLDBOY!

\

转义字符,让特殊含义的字符脱掉马甲,现出原形

找出以点结尾的行

[root@oldboy36  data]# grep "\.$" oldboy.txt
 
I teach linux.
 
my qq num is 49000448.
 
not 4900000448.
 
[root@oldboy36 data]#

 

 

穿上马甲\(扩展正则)

\n   匹配一个换行符

\b单词边界, \bcool\b 匹配cool,不匹配coolant

\>在边界的右边

\<在边界的左边

\r 匹配回车

\t 匹配一个横向制表符  tab

*

重复 前一个文本/字符0次或多次

之前的一个文本或字符连续了出现了0个或多个连续

出现了0 就代表啥也没有

 一般跟0*

正则 贪婪  在表示重复的时候  尽可能的拿的更多  匹配的更多,找的更多。

 

[root@oldboy36  data]# grep "0*" oldboy.txt
 
I am oldboy teacher!
 
I teach linux.
 
 
I like badminton ball  ,billiard ball and chinese chess!
 
my blog is  http://oldboy.blog.51cto.com
 
our site is  http://www.etiantian.org
 
my qq num is 49000448.
 
 
not 4900000448.
 
my god ,i am not  oldbey,but OLDBOY!\

.*

代表所有

包含空行 ^.*以任意多个字符开头;.*$以任意多个字符结尾

正则表达式表示连续出现连续出现或者连续的时候有多少吃多少。

正则表达式的贪婪

[root@oldboy36  data]# grep   ".*" oldboy.txt  
 
I am oldboy teacher!
 
I teach linux.
 
 
I like badminton ball  ,billiard ball and chinese chess!
 
my blog is  http://oldboy.blog.51cto.com
 
our site is  http://www.etiantian.org
 
my qq num is 49000448.
 
 
not 4900000448.
 
my god ,i am not  oldbey,but OLDBOY!\
 
\
 
[root@oldboy36 data]#

 

以所有字符开头一直到字母m

[root@oldboy36 data]# grep    "^.*m" oldboy.txt
 
I am oldboy  teacher!
 
I like badminton ball ,billiard ball and chinese chess!
 
my blog is http://oldboy.blog.51cto.com
 
my qq num is 49000448.
 
my god ,i am not oldbey,but OLDBOY!\

^.*

以任意多个字符串开头

.* 尽可能多吃  有多少吃多少

[root@oldboy36  data]# grep   "^.*m"  oldboy.txt
 
I am oldboy teacher!
 
I like badminton ball ,billiard ball and chinese  chess!
 
my blog is  http://oldboy.blog.51cto.com
 
my qq num is 49000448.
 
my god ,i am not oldbey,but OLDBOY!\

括号表达式(筐) 表示一个整体相当于一个符号 文本  一次只匹配一个符号。

[abc]

[0-9]

+[\.,/]

 

匹配字符集合(一个框里便有很多条件)内的任意字符abc[a-z]匹配所有小写字母

筐:代表的一个整体,里面啥都可能有

[abc]abc,可以写成[a-c]

可以进行组合 [a-zA-Z]

正则表达式认为只要是在框里的就是一样的

匹配字符集合(一个框里便有很多条件)内的任意字符a或b或c

[root@oldboy36  data]# grep [a-c] oldboy.txt
 
I am oldboy teacher!
 
I teach linux.
 
I like badminton ball ,billiard ball and chinese chess!
 
my blog is http://oldboy.blog.51cto.com
 
our site is  http://www.etiantian.org
 
y god ,i am not oldbey,but OLDBOY!\
 
[root@oldboy36 data]#

 

 

[^abc]

匹配不包含……后的任意字符abc,是对[abc]的取反,且与^含义不同.

[root@oldboy36  data]# grep [^a-c] oldboy.txt
 
I am oldboy teacher!
 
I teach linux.
 
I like badminton ball ,billiard ball and chinese chess!
 
my blog is http://oldboy.blog.51cto.com
 
our site is  http://www.etiantian.org
 
my qq num is 49000448.
 
not 4900000448.
 
y god ,i am not oldbey,but OLDBOY!\
 
\
 
[root@oldboy36 data]#

 


基础正则的命令(grep)如何支持高级正则(扩展正则)

a\{n,m\}

重复前面a字符nm次。 如果用egrepsed -r 可去掉斜线

最少出现n次,最多出现m

\ 表示穿上马甲  \学生=======班长 扩展正则

[root@oldboy36 data]# egrep  "0{1,2}" oldboy.txt
 
my qq num is 490004480.
 
not 4900000448.
 
[root@oldboy36 data]#  egrep -o "0{1,2}" oldboy.txt
 
00
 
0
 
0
 
00
 
00
 
0
 
[root@oldboy36 data]#

a\{n,\}

重复前面a字符至少n次,如果用egrepsed -r 可去掉斜线

[root@oldboy36 data]# egrep  "0{3}" oldboy.txt
 
my qq num is 490004480.
 
not 4900000448.
 
[root@oldboy36 data]#

a\{n\}

重复前面a字符n次,如果用egrepsed -r 可去掉斜线

[root@oldboy36 data]# egrep  "0{3,}" oldboy.txt
 
my qq num is 490004480.
 
not 4900000448.
 
[root@oldboy36 data]#  egrep -o "0{3,}" oldboy.txt
 
000
 
00000
 
[root@oldboy36 data]#

a\{,m\}

重复前面a最多m次,如果用egrepsed -r 可去掉斜线

[root@oldboy36 data]# egrep  "0{,3}" oldboy.txt
 
I am oldboy teacher!
 
I teach linux.
 
++++++++++++++++++++++++++++++++++
 
I like badminton ball  ,billiard ball and chinese chess!
 
my blog is  http://oldboy.blog.51cto.com
 
our site is  http://www.etiantian.org
 
my qq num is 490004480.
 
 
not 4900000448.
 
y god ,i am not  oldbey,but OLDBOY!
 
 
[root@oldboy36 data]#  egrep -o "0{,3}" oldboy.txt
 
000
 
0
 
000
 
00
 
[root@oldboy36 data]#

1.5 扩展正则表达式

特殊字符

内容及含义

+

重复前一个字符一次或一次以上

把连续的字符/文本取出来

若何让数字连续出现1次或多次

[0-9]+   正则表达式里面 表示重复 的命令 连续重现特点 贪婪 有多少就连续多少次 [a-z] 取出文件的单词

[root@oldboyedu36-nb data]# egrep "0+" oldboy.txt

my qq num is 49000448.

not 4900000448.

[root@oldboyedu36-nb data]# #

[root@oldboyedu36-nb data]# #"0+"  前一个符号/文本 连续出现1次或多次

[root@oldboyedu36-nb data]# #正则表达式里面 表示重复   连续出现  贪婪 有多少吃多少 有多少连续多少次

[root@oldboyedu36-nb data]# egrep "0" oldboy.txt

my qq num is 49000448.

not 4900000448.

[root@oldboyedu36-nb data]# egrep "0+" oldboy.txt

my qq num is 49000448.

not 4900000448.

[root@oldboyedu36-nb data]# ###找连续的0

[root@oldboyedu36-nb data]#

[root@oldboyedu36-nb data]# egrep -o  "0" oldboy.txt

0

0

0

0

0

0

0

0

[root@oldboyedu36-nb data]# ####grep egrep -o 会把每一次找到的东西 以一行来显示

[root@oldboyedu36-nb data]#

[root@oldboyedu36-nb data]# egrep -o "0+" oldboy.txt

000

00000

[root@oldboyedu36-nb data]# #####+ "0+"  前一个符号/文本 连续出现1次或多次      找连续出现的东西

重复前面一个字符0次或1次(是有且只有一个)

前一个字符连续出现0次或1

[root@oldboy36 data]# egrep  "g?d" a.log
 
good
 
glad
 
gd
 
god
 
goood
 
[root@oldboy36 data]#  egrep  "go?d" a.log
 
gd
 
god

|

表示或者 同时过滤多个字符

[root@oldboyedu-nb data]# dumpe2fs /dev/sda3 |egrep -i "inode size|inode count"
 dumpe2fs 1.41.12 (17-May-2010)
 Inode count:              462384
 Inode size:            256

 

()

分组过滤被括起来的东西表示一个整体(一个字符),反向引用

[root@oldboy36 data]# cat a.log

good

glad

gd 

god

goood

[root@oldboy36 data]# egrep   "g(..)d" a.log

good

glad

[root@oldboy36 data]# egrep   "g(oo|la)d" a.log

good

glad

[root@oldboy36 data]#

本文出自 “暖心向阳” 博客,请务必保留此出处http://nuanxin.blog.51cto.com/9619425/1927045

正则表达式