正则表达式

正则表达式

本文主要是介绍正则表达式,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

什么是正则表达式?

为处理文本、字符串而定义的一套规则和方法

包括:普通字符和特殊字符

基本正则表达式

文字匹配

[root@fedora ~]# grep charlie /etc/passwd
charlie:x:1001:1001::/home/charlie:/bin/bash

锚匹配

匹配所有包含字母h的行

[root@fedora ~]# grep h /etc/passwd
root:x:0:0:root:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt

^ 匹配行首

[root@fedora ~]# grep ^h /etc/passwd
halt:x:7:0:halt:/sbin:/sbin/halt

$ 匹配行尾

[root@fedora ~]# grep h$ /etc/passwd
root:x:0:0:root:/root:/bin/bash
chrlie:x:1000:1000:chrlie brown:/home/chrlie:/bin/bash
charlie:x:1001:1001::/home/charlie:/bin/bash

^$ 匹配空行

[root@fedora ~]# grep ^$ test.sh 


[root@fedora ~]# 

\< 匹配以字母h开头的词

[root@fedora ~]# grep "\<h" /etc/passwd
halt:x:7:0:halt:/sbin:/sbin/halt
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
flatpak:x:986:983:User for flatpak system helper:/:/sbin/nologin
chrlie:x:1000:1000:chrlie brown:/home/chrlie:/bin/bash
charlie:x:1001:1001::/home/charlie:/bin/bash

\> 匹配以字母h结尾的词

[root@fedora ~]# grep "h\>" /etc/passwd
root:x:0:0:root:/root:/bin/bash
saslauth:x:992:76:Saslauthd user:/run/saslauthd:/sbin/nologin
chrlie:x:1000:1000:chrlie brown:/home/chrlie:/bin/bash
charlie:x:1001:1001::/home/charlie:/bin/bash

\< \> 完整匹配单词bash

[root@fedora ~]# grep "\<bash\>" /etc/passwd
root:x:0:0:root:/root:/bin/bash
chrlie:x:1000:1000:chrlie brown:/home/chrlie:/bin/bash
charlie:x:1001:1001::/home/charlie:/bin/bash

匹配任何字符

. 点:匹配任意一个字符(换行符除外)

[root@fedora ~]# grep ".TF" anaconda-ks.cfg 
lang zh_CN.UTF-8
[root@fedora ~]# echo "a123 b1234 c12" | grep "12."
a123 b1234 c12
# 此处不匹配c12,因为"12."中"."要求至少要有一个字符

括号表达式

[……] 方括号:匹配该括号字符集中的某一个字符

[a-z] # 匹配所有小写字母
[A-Z] # 匹配所有大写字母
[a-zA-Z] # 匹配所有字母
[0-9] # 匹配所有数字
# 方括号里 ^ 表示 非或排除 的意思
[^a-z] # 匹配除了小写字母以外的所有字符
[Yy][Ee][Ss] # 匹配所有yes(不区分大小写)

重复模式零次或多次

* 星号:匹配她前面字符的任意多次,包括0次

[root@fedora ~]# echo "z zo zoo" | grep zo*
z zo zoo

转义元字符

\ 反斜线:转义某一个特殊含义的字符,将其解释为字面含义

1.使用 \$ ,将 $ 解释为美元符号
2.使用 \\ ,表示字符 \
3.grep "^[A-Z].*\$" file
# 从file中匹配以大写字母开头、以"."结尾的任意字符

grep 如何 支持拓展正则表达式?

1. grep 采用 -E ,--extended-regexp 选项,将模式解释为拓展正则表达式(ERE)

2. grep 的模式中采用转义符

3. 使用 egrep 代替 grep


拓展正则表达式

数量词

*  星号:匹配它前面字符的0次或无限次(>=0)

+ 加号:匹配它前面字符的1次或无限次(>=1)

?问号:匹配它前面字符的1次或0次(=1或=0)

重复

{ } 大括号中加上一个或两个数字,指定它前面匹配的重复的次数

有些应用程序需要进行转义,否则大括号仅仅表示字面含义

{m} 匹配前一个字符m次

{m,n} 匹配前一个字符m次至n次。

m和n可以省略:

1.若省略m,则匹配0至n次

2.若省略n,则匹配无限次

交替

| 管道符:用于匹配一组可选字符中的任意一个

# 从文件GPL中匹配GPL或General Public Licenses
grep -E "GPL|General Public Licenses" GPL 
grep "GPL\|General Public Licenses" GPL 
egrep "GPL|General Public Licenses" GPL 

分组

( ) 圆括号:将一组正则表达式括起来,构建子表达式

子表达式的用途

作为一个整体,进行逻辑划分

(GPL|General) Public Licenses
# 匹配GPL Public Licenses 或 General Public Licenses
(abc){2} # 匹配 abcabc
a(123|456)b # 匹配 a123c 或 a456c

通过子表达式的编号,进行反向引用


反向引用与子表达式

在圆括号中的子表达式将匹配内容存储到一个临时缓冲区(寄存器)中

按照从左到右出现的顺序存储

编号从数字1开始,最多可存储9(或99)个捕获的子表达式

使用\n访问每个缓冲区,其中n是表示特定的缓冲区十进制数


这篇关于正则表达式的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!