正则表达式基础 | 学习笔记

简介: 快速学习正则表达式基础。

开发者学堂课程【Linux文本处理、正则表达式与Vim正则表达式基础】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/592/detail/8352


正则表达式基础


内容介绍

一、   正则表达式基本介绍

二、   基本正则表达式元字符

三、   匹配次数

四、   位置查找

五、   分组

 

一、正则表达式基本介绍

REGEXP

Reqular  Expressions ,它的使用与前面所说的通配符相似,由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能。

程序支持:

greensedawkvimlessnginxvarnish 等,只要应用的功能比较强大,通常就会支持正则表达式,甚至连 Windows 中 也支持

分两类:

基本正则表达式:BRE

扩展正则表达式:ERE

grep-E,egrep

正则表达式引擎:

采用不同算法,检查处理正则表达式的软件模块

PCRE(Perl  Compatible  Regular  Expressions )

元字符分类:字符匹配、匹配次数、位置锚定、分组

man 7 regex

Windows 中查看正在连接主电脑的电脑的方法:

打开 cmd,在 cmd 中输入netstat -n,结果如下图,其中本地地址即为主电脑的IP地址,外部地址就是连接在主电脑上的 IP 地址。

现查找 IP 地址中包括250的方法:

cmd 中输入 netstat -n | findstr 250,结果如下图

 

二、基本正则表达式元字符

字符匹配

.匹配任意单个字符

Ⅱ匹配指定范围内的任意单个字符,示例:[wang][0-9][a-z][a-zA-Z]

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

[:alnum:]字母和数字

[:alpha:]代表任何英文大小写字符,亦即A-Za-z

[:lower:]小写字母[:upper:]大写字母

[:blank:]空白字符(空格和制表符)

[space:]水平和垂直的空白字符([blank]包含的范围广)

[:cntrt:]不可打印的控制字符(退格、删除、警铃...

[:digit:]十进制数字][xdigit:]十六进制数字

[:graph:]可打印的非空白字符

[:print:]可打印字符

[:punct:]标点符号

1)演示案例

示例1

表示选择含有在1~3之间的位置:

[root@centos7 ~]#grep [1-3]/etc/passwd

演示结果:

示例2

表示选择不含有在1~3之间的位置(-v表示取反):

[root@centos7 ~]#grep -v [1-3] /etc/passwd

示例3

表示选择不包括有在1~3的位置:

[root@centos7 ~]#grep [^1-3] /etc/passwd

演示结果:

(红色表示匹配的字符,表示包含除了123的其他字符)

示例1

现需要显示 IP 地址:

运行:[root@centos7 ~]#ifconfig eth0(可以显示出带有IP地址的所有内容)

演示结果:

eth0:flags=4163<UP,BR0ADCAST,RUNNING,MULTICAST>mutton

inet 192.168. 34.7 netmask 255.255. 255.0 broadcast 192.168.34. 255

inet6fe80x :20c:29ff:fe71: 55b3prefixlen64scopeid0x20 <1imlo

ether 00:0c:29:71:55: b3txqueuelen  1000(Ethernet)

RX packets 42285 bytes 14532868(13,8MiB)

RX errors 0 dropped 0 overruns 0 frame 0

TX packets 34814 bytes 7615961(7,2MiB)

TX errors 0 dropped 0 overruns  0carrier0collisions  0

改进1

[root@centos7 ~]#ifconfig eth0|grep netmask(可以显示出带有IP地址的所在行)

运行结果:

inet 192. 168. 34. 7 netmask 255. 255. 255.0 broadcast 192. 168. 34. 255

改进2

[root@centos7 ~]#ifconfig eth0 | grep netmask | grep -o [[:digit:].] (只显示IP地址)

注意:[[:digit:].]的写法与 [0-9.]写法是等价的。

运行结果:

192.168. 34 255. 255. 255.0 192. 168. 34. 255

三、匹配次数

匹配次数:用在要指定次数的字符后面,用于指定前面的字符要出现的次数

*匹配前面的字符任意次,包括0.例如 a*,表示对 a 的出现的次数不定(包括零次),0a 就是‘ ’,一个 a 就是 a ,两个 a 就是 aa,三个 a 就是 aaa……

贪婪模式:尽可能长的匹配

.*任意长度的任意字符。

\?匹配其前面的字符01

\+匹配其前面的字符至少1

\{n}匹配前面的字符 n

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

\{n\3}匹配前面的字符至多 n

\{n\}匹配前面的字符至少 n

1)示例:

将下列代码写入文件中去:

[root@centos7~]#cat>f1

google

goooooooooooooogle

gogle

ggle

g0000ooooooole

^C

[root@centos7~]]#cat f1

google

goooooooooooooogle

gogle

ggle

g0000ooooooole

现想查询代码中 o 的个数,由 于 o 不确定的个数,则需要运行以下代码:

1.查找至少含有0o 的个数

[root@centos7 ~]#grep go*gle f1

运行结果如下:

google

goooooooooooooogle

gogle

ggle

2.查找至少含有2o 的个数

[root@centos7 ~]#grep gooo*gle f1

运行结果如下:

google

goooooooooooooogle

3. .*任意字符

[root@centos7 ~]#grep g.*gle f1

运行结果如下:

google

4.  \?匹配其前面的字符01

[root@centos7 ~]#grep go\?gle f1

运行结果如下:

gogle

ggle

5.\+匹配其前面的字符至少1

[root@centos7 ~]#grep go\+gle f1

运行结果如下:

google

goooooooooooooogle

gogle

6. \{n}匹配前面的字符 n  

[root@centos7~]#grep go\{14\}gle f1

运行结果如下:

goooooooooooooogle

7.\{m,n}匹配前面的字符至少 m n

6. \{n}go\{14\}gle

运行结果如下:

goooooooooooooogle

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

6. \{n}匹配前面的字符n

8.\{n\3}匹配前面的字符至多 n

[root@centos7~]#grep go\{,14\}gle f1

运行结果如下:

goooooooooooooogle

8.\{n\3}匹配前面的字符至多 n

[root@centos7~]#grep go\{,14\}gle f1

运行结果如下:

9.\{n\}匹配前面的字符至少 n

[root@centos7~]#grep go\{2,\}gle f1

运行结果如下:

google

goooooooooooooogle

演示:

先将 I P 地址显示出来输入:

运行:[root@centos7 ~]#ifconfig eth0

演示结果:

eth0:flags=4163<UP,BR0ADCAST,RUNNING,MULTICAST>mutton

inet 192.168. 34.7 netmask 255.255. 255.0 broadcast 192.168.34. 255

inet6fe80x :20c:29ff:fe71: 55b3prefixlen64scopeid0x20 <1imlo

ether 00:0c:29:71:55: b3txqueuelen  1000(Ethernet)

RX packets 42285 bytes 14532868(13,8MiB)

RX errors 0 dropped 0 overruns 0 frame 0

TX packets 34814 bytes 7615961(7,2MiB)

TX errors 0 dropped 0 overruns  0carrier0collisions  0

然后在上述结果中选取一位到三位之间的数字,

运行:[root@centos7 ~]#ifconfig eth0 | grep [0-9]\{1,3\}

演示结果如下图所示:(红色表示所筛选出的结果)

因为所包含的贪婪模式,会进一步读取到千位,所以要想单个输入对应的字符则需要将代码改写成:[root@centos7~]#ifconfig eth0 | grep -o [0-9]\{1,3\}

运行:[root@centos7 ~]#ifconfig eth0 | grep -o [0-9]\{1,3\}.[0-9]\{1,3\}. [0-9]\{1,3\}. [0-9]\{1,3\}.

演示结果:

192.168.34.7

255.255.255.0

192.168.34.255

14667367

7749514

注意:最后两行的出现是由于代码中的“.,需要用到转义字符”\,需要对代码进行改进

改进1

运行:

[root@centos7~]#ifconfig eth0 | grep -o [0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}.

演示结果:

192.168.34.7

255.255.255.0

192.168.34.255

改进2;(只提取第一行的IP地址)

运行:[root@centos7 ~]#ifconfig eth0 | grep -o [0-9]\{1,3\}.[0-9]\{1,3\}. [0-9]\{1,3\}. [0-9]\{1,3\}. “ |head -n1

演示结果:

192.168.34.7

 

四、位置查找

位置锚定:定位出现的位置

^行首锚定,用于模式的最左侧

行尾锚定,用于模式的最右侧

^PATTERN$用于模式匹配整行

^空行

^[[space]]*$空白行

\<\b词首锚定,用于单词模式的左侧

\>\b词尾锚定,用于单词模式的右侧

\<PATTERN>匹配整个个单词

1)示例:

1. ^行首锚定,用于模式的最左侧

运行:[root@centos7 ~]#grep ^root /etc/passwd

演示结果:

root:x:0:0:root:/root:/bin/bash

rooter:x:1003:1005::/home/rooter:/bin/bash

2. $行尾锚定,用于模式的最右侧

运行:[root@centos7~]#grep"bash$"/etc/passwd

演示结果:~

root:x:0:0:root:/root:/bin/bash

wang:x:1000:1000:wang:/home/wang:/bin/bash

mage:x:1001:1001::/home/mage:/bin/bash

zhang:x:1002:1003::/home/zhang:/bin/bash

rooter:x:1003:1005::/home/rooter:/bin/bash

adroot:x:1004:1006::/home/adroot:/bin/bash

rooooter:x:1005:1007::/home/rooooter:/bin/bash

roooter:x:1006:1008::/home/roooter:/bin/bash

3.演示:

[root@centos7~]#cat f1

google

google google goooooooooooooole

gogle

ggle google

g0000oooooole

gooooole

goooooooooooooooooooole

[root@centos7~]#grep google f1

运行后为:

google

google google goooooooooooooole

ggle google

[root@centos7~]#grep ^google$ f1

运行后为:

google

[root@centos7~]#cat -A f1(表示查看空行)

运行后为:

google$

$

google google goooooooooooooole$

gogle$

ggle google$

g0000oooooole$

gooooole$

goooooooooooooooooooole$

[root@centos7~]#grep v ^$ f1(表示查看非空行)

运行后为:

google

google google goooooooooooooole

gogle

ggle google

g0000oooooole

gooooole

goooooooooooooooooooole

4.演示

[root@centos7 ~]#cat /etc/fstab

# /etc/fstab

#Created by anaconda on Wed Sep 19 19:44:23 2018

#

#Accessible filesystems, breference, are maintained under /dev/disk'

#See man pages fstab(5), findfs(8), mount(8) and/or b1kid(8) for more info

UUID=89419d13- 8564- 4340- 8650- a360afef1bf7 /.       xfs    defaults 00

UUID=76255676-990f- 4f0e-963e-bab166b4f3ea /boot     xfs    defaults 00

UUID=27bf5dd1-cc54-46f0- 896e-f93d3dea68ee data       xfs    defaults 00

UUID=701416eb-5a4a- 4b3f-b713-a5a291829329 swap    xfs    defaults 00

[root@centos7 ~]#grep ^# /etc/fstab

# /etc/fstab

#Created by anaconda on Wed Sep 19 19:44:23 2018

#

#Accessible filesystems, breference, are maintained under /dev/disk'

#See man pages fstab(5), findfs(8), mount(8) and/or b1kid(8) for more info

[root@centos7 ~]#grep  -v ^# /etc/fstab

UUID=89419d13- 8564- 4340- 8650- a360afef1bf7 /.       xfs    defaults 00

UUID=76255676-990f- 4f0e-963e-bab166b4f3ea /boot     xfs    defaults 00

UUID=27bf5dd1-cc54-46f0- 896e-f93d3dea68ee data       xfs    defaults 00

UUID=701416eb-5a4a- 4b3f-b713-a5a291829329 swap    xfs    defaults 00

[root@centos7 ~]#grep  -v ^#”  “^$ /etc/fstab

grep:^$:No such file or directory

/etc/fstab:

/etc/fstab: UUID=89419d13- 8564- 4340- 8650- a360afef1bf7 /.      xfs    defaults

/etc/fstab: UUID=76255676-990f- 4f0e-963e-bab166b4f3ea /boot     xfs    defaults

/etc/fstab: UUID=27bf5dd1-cc54-46f0- 896e-f93d3dea68ee data       xfs   defaults  

/etc/fstab: UUID=701416eb-5a4a- 4b3f-b713-a5a291829329 swap    xfs    defaults

[root@centos7 ~]#df

aeraurus oo

LDoucents/~

Filesystem   1K-blocks  used    Available       Use% Mounted on

/dev/sda2   52403200  35782    4848824952    7 %   /

devtmpfs    916724    0       916724         0%    /dev

tmpfs       932652     0      932652         0%    /dev/shm

tmpfs       932652     10632  922020         2 %    /run

tmprs       932652     0      932652         0%     /sys/fs/cgroup

/dev/ sda    331441920 33000  31408920       1 %    /data

/dev/ sda    11038336  168556  869780        17 %   /boot

tmpfs       186532      32    186500         1 %     /run/user/0

/dev/sr      09176232  9176232   0         100 %    /run/media/root/centos 7x86_ 64

示例:查询以 root 为词首的单词

[root@centos7~]# grep \<root /etc/passwd

root:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

rooter:x:1003:1005::/home:/rooter:/bin/bash:

[root@centos7~]# grep root\> /etc/passwd

root:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

rooter:x:1003:1005::/home:/rooter:/bin/bash:

注意:单词是指连续的字符前面不能是数字,字母、下划线等不可以作为单词的分隔符

并且‘\<’与’\b’相同,\>’与’\b’相同

 

五、分组

分组:\(\)将一个或多个字符捆绑在一起,当作一个整体处理,如:\(root\)\+

分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为:\1\2\3...

\1表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符

示例:(sftyring1\+\(string 2\)*\)

\1:string1\+\(string2\)

\2:string2

后向引用:引用前面的分组括号中的模式所匹配字符,而非模式本身

或者:

示例:a\|b:a b  C\|cat: C cat  \(C\|c\) at:Cat cat

1)演示示范:

[root@centos7 ~]#cat >f1

abcabc

abcabcabc

abc

^C

[root@centos7 ~]#cat  f1

abcabc

abcabcabc

abc

//表示连续的 abc 出现三次

[root@centos7 ~]#grep  \(abc\)\{3\} f1

abcabcabc

[root@centos7 ~]#grep  abc\{3\} f1

[root@centos7 ~]#echo  abccc >> f1

>  ^c

[root@centos7 ~]#echo  abccc >> f1

[root@centos7 ~]#grep  abc\{\3}f1

//运行

abccc

//增加以下字符

[root@centos7 ~]#cat >> f1

abc abc

abc

^C

[root@centos7 ~]#cat f1

abcabc

abcabcabc

abc

abccc

abc abc

abc

[root@centos7 ~]#grep \(abc\).*\1 f1

//运行

abcabc

abcabcabc

abc abc

[root@centos7 ~]#cat > f1

xyz zyx

abc xyz abc xyz

^c

[root@centos7 ~]#cat f1

xyz zyx

abc xyz abc xyz

[root@centos7 ~]#grep \(abc\).*\(xyz\).*\1 f1

//运行

abc xyz abc xyz

[root@centos7 ~]#grep \(abc\).*\(xyz\).*\2 f1

abc xyz abc xyz

[root@centos7 ~]#echo 123ab123xxy123 >f1

[root@centos7 ~]cat f1

123ab123xxy123

[root@centos7 ~]#cat f1 |grep \(123\).*\1

123ab123xxy123

[root@centos7 ~]#cat f1

123ab123xxy123

234xxx567

[root@centos7 ~]#cat f1 | grep \([0-9]\){3\}

123ab123xxy123

234xxx567

[root@centos7 ~]#cat f1 | grep \([0-9]\){3\}.*\1

123ab123xxy123

[root@centos7 ~]#cat 567aaa567 >>f1

cat:567aaa567:No such file or directory

[root@centos7 ~] #echo  567aaa567 >>f1

[root@centos7 ~]#cat f1 | grep \([0-9]\){3\}.*\1

123ab123xxy123

567aaa567

[root@centos7 ~]#grep  ^(a\|b)/etc/passwd

[root@centos7 ~]#grep  ^\(a\|b)/etc/passwd

bin:x:1:1:bin:/bin:/sbin/nologin

adm:x:3:4:adm:/var/adm:/sbin/nologin

abrt:x:173:173::/etc/abrt:/sbin/nologin

avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin

adroot:x:1004:1006::/home/adroot:/bin/bash

[root@centos7~1#grep -E ^(a|b) /etv/passwd

bin:x:1:1:bin:/bin:/sbin/nologin

adm:x:3:4:adm:/var/adm:/sbin/nologin

abrt:x:173:173::/etc/abrt:/sbin/nologin

avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin

adroot:x:1004:1006::/home/adroot:/bin/bash

[root@centos7 ~]#ifconfig

eth0:flags=4163<UP,BROADCAST,RUNNING,MULTICAST>mtu 1500

inet 192.168.34.7 netmask 255.255.255.0 broadcast 192.168.34.255

inet6 fe80::20c:29ff:fe71:55b3 prefixlen 64 scopeid 0x20<1ink>

ether 00:0c:29:71:55: b3 txqueuelen  1000(Ethernet)

RX packets 45986 bytes 14978482(14.2MiB)

RX errors 0 dropped 0 overruns 0 frame 0 TX packets 37482`bytes 8048294(7.6MiB)

TX errors 0 dropped 0 overruns 0 carrier 0  collisions  0

eth1:flags=4163<UP,BROADCAST,RUNNING,MULTICAST>mtu1500

inet 172. 16. 251. 30 netmask 255. 255.0.0 broadcast 172. 16. 255. 255

inet6 fe80:5b87:e9b5:19b0:3024 _ prefixlen 64  scopeid0x20 <link>

ether 00:0c:29:71:55:bd  toxqueuelen 1000 (Ethernet)

RX packets 168364 bytes 16280566(15.5 MiB)

RX errors 0 dropped^0 overruns 0 frame 0

TX packets 593 bytes 54029(52.7KiB)

TX errors 0 dropped 0 overruns 0 carrier 0  collisions  0

lo:f1ags=73<UP,LOOPBACK,RUNNING>mtu65536

inet 127.0.0.1 netmask 255.0.0.0

inetó::1 prefixlen 128  scopeid0x10 <host>

loop  txqueuelen 1000(Local Loopback)

RX packets 110 bytes 12104(11.8KiB)

Rx errors 0 dropped 0 overruns 0 firame 0

TX packets 110 bytes 12104(11.8kiB)

TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

现在将代码中得 IP 地址提取出来

[root@centos7 ~]#ifconfig eth0[root@centos7]#ifconfig"eth0

eth0:flags=4163<UP,BROADCAST,RUNNING,MULTICAST>mu1500

inet 192. 168. 34.7. netmask 255. 255.0. broadcast 192. 168. 34. 255

inet6fe80::20c:29ff:fe71: 55b3prefixlen64scopeid0x20 <Iink>

ether 00:0c:29:71:55: b3txqueuelen  1000(Ethernet)

RX packets 46088 bytes 14991882(14.2MiB)

RX errors 0 dropped 0 overruns 0 frame 0

TX packets 37578 bytes 8086326(7.7MiB)

Tx errors 0 dropped 0 overruns 0 carrier 0  collisions  0

[root@centos7~]# ifconfig eth0Igrep "\([0~9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}"

inet 192.168.34.7netmask255 , 255. 255:0 broadcast 192.168.34.255

[root@centos7~]# ifconfig eth0 | grep -o"\([0-9]\{1,3\}\.\{3}{[0-9]\{1,3\}"

192. 168. 34.7

255. 255. 255.0

192. 168. 34. 255

[root@centos7~]#ifconfig eth0|grep-o"\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}" |head -1

192. 168. 34.7

相关文章
|
12月前
java202303java学习笔记第二十七天-正则表达式之3
java202303java学习笔记第二十七天-正则表达式之3
27 0
|
12月前
java202303java学习笔记第二十八天-正则表达式基本练习2
java202303java学习笔记第二十八天-正则表达式基本练习2
48 0
|
12月前
java202303java学习笔记第二十八天-正则表达式基本练习1
java202303java学习笔记第二十八天-正则表达式基本练习1
41 0
|
12月前
java202303java学习笔记第二十八天-正则表达式基本练习3 原
java202303java学习笔记第二十八天-正则表达式基本练习3 原
38 0
|
12月前
java202303java学习笔记第二十七天-正则表达式基本练习1
java202303java学习笔记第二十七天-正则表达式基本练习1
45 0
|
12月前
java202303java学习笔记第二十七天-正则表达式之2
java202303java学习笔记第二十七天-正则表达式之2
39 0
|
12月前
java202303java学习笔记第二十七天-正则表达式之1
java202303java学习笔记第二十七天-正则表达式之1
36 0
|
12月前
java202303java学习笔记第二十七天-正则表达式之4
java202303java学习笔记第二十七天-正则表达式之4
27 0
|
12月前
java202303java学习笔记第二十七天-正则表达式之3
java202303java学习笔记第二十七天-正则表达式之3
30 0
|
开发者 Python
正则表达式4|学习笔记
快速学习正则表达式4
95 0
正则表达式4|学习笔记