正则表达式

正则表达式


1. 正则表达式分类

正则表达式:REGEXP,REGular EXPression。
正则表达式分为两类:

  • Basic REGEXP(基本正则表达式)
  • Extended REGEXP(扩展正则表达式)

2. 基本正则表达式

//元字符
    .           //任意单个字符
    []          //匹配指定范围内的任意单个字符
    [^]         //匹配指定范围外的任意单个字符
//匹配次数(贪婪模式)
    *           //匹配其前面的任意单个字符任意次
    .*          //任意长度的任意字符
    \?          //匹配其前面的任意单个字符1次或0次
    \+          //匹配其前面的任意单个字符至少1次
    \{m,n\}     //匹配其前面的任意单个字符至少m次,至多n次
//位置锚定
    ^           //锚定行首,此字符后面的任意单个字符必须出现在行首
    $           //锚定行尾,此字符前面的任意单个字符必须出现在行尾
    ^$          //空白行
    \<或\b       //锚定词首,其后面的任意单个字符必须作为单词首部出现
    \>或\b       //锚定词尾,其前面的任意单个字符必须作为单词尾部出现
/分组
    \(\)
    例:\(ab\)*
    //后向引用
        \1      //引用第一个左括号以及与之对应的右括号所包括的所有内容
        \2      //引用第二个左括号以及与之对应的右括号所包括的所有内容

在这里插入图片描述

演示:

[root@node01 opt]# touch {1..100}
[root@node01 opt]# touch {a..z}
[root@node01 opt]# touch {A..Z}
[root@node01 opt]# ls
1    18  27  36  45  54  63  72  81  90  a  f  k  p  u  z
10   19  28  37  46  55  64  73  82  91  A  F  K  P  U  Z
100  2   29  38  47  56  65  74  83  92  b  g  l  q  v
11   20  3   39  48  57  66  75  84  93  B  G  L  Q  V
12   21  30  4   49  58  67  76  85  94  c  h  m  r  w
13   22  31  40  5   59  68  77  86  95  C  H  M  R  W
14   23  32  41  50  6   69  78  87  96  d  i  n  s  x
15   24  33  42  51  60  7   79  88  97  D  I  N  S  X
16   25  34  43  52  61  70  8   89  98  e  j  o  t  y
17   26  35  44  53  62  71  80  9   99  E  J  O  T  Y

.           //任意单个字符
[root@node01 opt]# ls | grep '^.$'	#匹配开头和结尾都是一个字符的
1
2
3
4
5
6
7
8
9
a
A

[]          //匹配指定范围内的任意单个字符
[root@node01 opt]# ls | grep '[adf]'
a
d
f

[]          //匹配指定范围内的任意单个字符
[root@node01 opt]# ls | grep '^[1-9]$'		#只匹配开头和结尾是1-9的单个字符
1
2
3
4
5
6
7
8
9

[^]         //匹配指定范围外的任意单个字符
[root@node01 opt]# ls | grep '^[^1-9]$'		#匹配单个字符里面有数字以外的字符
a
A
b
B
c
C
d
D
e
E
f
F
g
G
h
H
i
I
j
J
k
K
l
L
m
M
n
N
o
O
p
P
q
Q
r
R
s
S
t
T
u
U
v
V
w
W
x
X
y
Y
z
Z

[root@node01 opt]# ls | grep '[a-zA-Z]'		#匹配单个字符为a-z和A-Z的字符
a
A
b
B
c
C
d
D
e
E
f
F
g
G
h
H
i
I
j
J
k
K
l
L
m
M
n
N
o
O
p
P
q
Q
r
R
s
S
t
T
u
U
v
V
w
W
x
X
y
Y
z
Z

\{m,n\}     //匹配其前面的任意单个字符至少m次,至多n次
[root@node01 opt]# ls | grep '[147]\{2\}'		匹配147至少2次以上
11
14
17
41
44
47
71
74
77

[root@node01 opt]# ls | grep '[147][147]'
11
14
17
41
44
47
71
74
77

[^]         //匹配指定范围外的任意单个字符
[root@node01 opt]# ls | grep '[^a-z]'		#匹配a-z以外的任意字符
 
0714-8750342
1
10
100
11
12

[root@node01 opt]# touch '^'
[root@node01 opt]# touch '\-'
[root@node01 opt]# ls | grep '\^\|\-'		#只匹配- ^
\-
^
0714-8750342

[root@node01 opt]# ls | grep '\^\|^[135]$'		#只匹配^ 和1 3 5
^
1
3
5

[root@node01 opt]# ls | grep '^[135^]$'		#只匹配^ 和1 3 5
^
1
3
5

[root@node01 opt]# cat abc 
hello 0714-8750123 hehe
(+86)13154204123
13154204123

[root@node01 opt]# grep '[1-9-]' abc 		#在[]里面的-如果不在两个数字或者字母之间就代表-他本身
hello 0714-8750123 hehe
(+86)13154204123
13154204123

[root@node01 opt]# ls | grep '^[1][1]$\|^[2][2]$'		#只匹配11 22
11
22

[root@node01 opt]# ls | grep '^[a]\|bc$'			#配置a 和abc
a
abc

 *           //匹配其前面的任意单个字符任意次
[root@node01 opt]# touch aa aaa aaaa aaaaa
[root@node01 opt]# ls | grep '^a*$'
a
aa
aaa
aaaa
aaaaa

*           //匹配其前面的任意单个字符任意次
\?          //匹配其前面的任意单个字符1次或0次
\+          //匹配其前面的任意单个字符至少1次
\{m,n\}     //匹配其前面的任意单个字符至少m次,至多n次
[root@node01 opt]# ls | grep '^[a]\+$'
a
aa
aaa
aaaa
aaaaa

.           //任意单个字符
*           //匹配其前面的任意单个字符任意次
[root@node01 opt]# ls | grep '.*'			正则表达式里面的.*就是我们平时使用的*
 
\-
^
0714-8750342
1
10
100
11

\?          //匹配其前面的任意单个字符1次或0次
[root@node01 opt]# touch ba baa
[root@node01 opt]# ls | grep '^ba\?$'	0次就是只匹配b一次就是匹配ba		
b
ba

\+          //匹配其前面的任意单个字符至少1次
[root@node01 opt]# ls | grep '^ba\+$'		#前面哪个a至少出现1一次或无数次
ba
baa

\{m,n\}     //匹配其前面的任意单个字符至少m次,至多n次
[root@node01 opt]# touch baaa baaaa baaaaa baaaaab		
[root@node01 opt]# ls | grep '^ba\{3,5\}$'				#a至少匹配3次,最多匹配5次
baaa
baaaa
baaaaa

\<或\b       //锚定词首,其后面的任意单个字符必须作为单词首部出现
\>或\b       //锚定词尾,其前面的任意单个字符必须作为单词尾部出现
[root@node01 opt]# echo "hello world hello tom hello jerry" | grep '\<hello'
hello world hello tom hello jerry
[root@node01 opt]# echo "hello world hello tom hello jerry" | grep '\<hello\>'
hello world hello tom hello jerry
[root@node01 opt]# echo "hello world hello1 tom hello jerry" | grep '\<hello\>'
hello world hello1 tom hello jerry
[root@node01 opt]# echo "hello world hello1 tom hello jerry" | grep ' \<hello\>'
hello world hello1 tom hello jerry

/分组
    \(\)
    例:\(ab\)*
*           //匹配其前面的任意单个字符任意次
[root@node01 opt]# ls | grep '^\(ab\)*$'		#匹配ab这个单词零次或者无数次
ab
abab
ababab
abababab

[root@node01 opt]# ls | grep '^\(ab\)\{1,2\}$'
ab
abab
[root@node01 opt]# ls | grep '^\(ab\)\(ab\)\?$'
ab
abab

//后向引用
        \1      //引用第一个左括号以及与之对应的右括号所包括的所有内容
        \2      //引用第二个左括号以及与之对应的右括号所包括的所有内容
演示: 
[root@node01 opt]# echo "hello world huayu"
hello world huayu
[root@node01 opt]# echo "hello world huayu" |sed 's/hello \(.*\) \(.*\)/hello \2 \1 /g'
hello huayu world 		#调换位置
\2 表示第二个括号里面的内容	也就是world
\1 表示第一个括号里面的内容 也就是huayu

3. 扩展正则表达式

//字符匹配
    .       //匹配任意单个字符
    []      //匹配指定范围内的任意单个字符
    [^]     //匹配指定范围外的任意单个字符
//次数匹配
    *       //匹配其前面的任意单个字符任意次
    ?       //匹配其前面的任意单个字符1次或0次
    +       //匹配其前面的任意单个字符至少1次
    {m,n}   //匹配其前面的任意单个字符至少m次,至多n次

//位置锚定
    ^       //锚定行首,此字符后面的任意单个字符必须出现在行首
    $       //锚定行尾,此字符前面的任意单个字符必须出现在行尾
    ^$      //空白行
    \<或\b       //锚定词首,其后面的任意单个字符必须作为单词首部出现
    \>或\b       //锚定词尾,其前面的任意单个字符必须作为单词尾部出现
//分组
    ()      //分组
    \1,\2,\3,....
   例:(ab)*
    //后向引用
        \1      //引用第一个左括号以及与之对应的右括号所包括的所有内容
        \2      //引用第二个左括号以及与之对应的右括号所包括的所有内容
//或者
    |       //or 默认匹配|的整个左侧或者整个右侧的内容
    //例:C|cat表示C或者cat,要想表示Cat或者cat则需要使用分组,如(C|c)at

扩展正则 一般都是加上-E sed语句里面是加上大写的-E 或者-r。

在扩展正则,里面就不需要加上那些什么\来转移了,这样就方便我们阅读了

演示:

//后向引用
        \1      //引用第一个左括号以及与之对应的右括号所包括的所有内容
        \2      //引用第二个左括号以及与之对应的右括号所包括的所有内容
[root@node01 opt]# echo "hello world huayu" |sed -r 's/hello (.*) (.*)/hello \2 \1 /g'
hello huayu world 

[root@node01 opt]# ls | grep -E '^(ab){1,2}$'
ab
abab

//或者
    |       //or 默认匹配|的整个左侧或者整个右侧的内容
    //例:C|cat表示C或者cat,要想表示Cat或者cat则需要使用分组,如(C|c)at
演示:
[root@node01 opt]# touch cat Cat
[root@node01 opt]# ls | grep -E '^(c|C)at$'			#|表示或者的意思
cat
Cat

实战过滤IP地址
[root@node01 opt]# ip addr
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:11:30:70 brd ff:ff:ff:ff:ff:ff
    inet 192.168.227.137/24 brd 192.168.227.255 scope global dynamic noprefixroute ens160
       valid_lft 958sec preferred_lft 958sec
    inet6 fe80::5c34:f03e:9d9c:d3b6/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
[root@node01 opt]# ip addr | grep -E '1[1-9]{1,2}.[1-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}/[1-9]{1,2}|1[1-9]{1,2}.[1-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}'
    inet 192.168.227.137/24 brd 192.168.227.255 scope global dynamic noprefixroute ens160

#取出座机的电话号码
[root@node01 opt]# cat abc 
hello 0714-8750123 hehe
(+86)13154204123
13154204123
(0532)8760956

[root@node01 opt]# grep -E '0[0-9]{2,3}-[0-9]{7}|\(0[0-9]{2,3}\)[0-9]{7}' abc 
hello 0714-8750123 hehe
(0532)8760956
或者
?       //匹配其前面的任意单个字符1次或0次
[root@node01 opt]# grep -E '\(?0[0-9]{2,3}\)?-?[0-9]{7}' abc 
hello 0714-8750123 hehe
(0532)8760956


取出电话号码:
[root@node01 opt]# cat abc 
hello 0714-8750123 hehe
(+86)13154204123
13154204123
(0532)8760956
[root@node01 opt]# grep -E '1[0-9]{10}|(\(\+86\))1[0-9]{10}' abc 
(+86)13154204123
13154204123

[root@node01 opt]# cat abc 
hello 0714-8750123 hehe
(+86)13154204123
13154204123
(0532)8760956
[root@node01 opt]# grep -E '1[135789][0-9]{9}|(\(\+86\))1[35789][0-9]{9}' abc 
(+86)13154204123
13154204123

bc
hello 0714-8750123 hehe
(0532)8760956

取出电话号码:
[root@node01 opt]# cat abc
hello 0714-8750123 hehe
(+86)13154204123
13154204123
(0532)8760956
[root@node01 opt]# grep -E ‘1[0-9]{10}|((+86))1[0-9]{10}’ abc
(+86)13154204123
13154204123

[root@node01 opt]# cat abc
hello 0714-8750123 hehe
(+86)13154204123
13154204123
(0532)8760956
[root@node01 opt]# grep -E ‘1[135789][0-9]{9}|((+86))1[35789][0-9]{9}’ abc
(+86)13154204123
13154204123


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值