正则表达式简明教程

正则表达式的原理

  简单地讲,正则表达式就是对文本进行过滤的工具。正则表达式之所以拥有过滤文本的功能,是因为它定义了一系列元字符。通过元字符与其它字符的配合来表达一种规则。只有符合此规则的文本才能被保留下来,其余的则会被过滤。

  所谓的元字符,是指用来描述字符的字符,元字符的作用在于对字符表达式的内容、转换以及各种操作信息进行描述。而正则表达式就是由各种元字符和一般字符构成的字符串。

基本正则表达式

  基本正则表达式(Basic Regular Expression,BRE),又称为标准正则表达式,是最早制订的正则表达式规范,仅支持最基本的元字符集。基本正则表达式是POSIX规范制订的两种正则表达式语法标准之一。基本正则表达式定义的元字符主要有如下几种:

  • 行首定位符 “^”

  "^"称为行首定位符,是正则表达式中的定位符之一,用来匹配行首的字符,表示行首的字符是"^"后面的那个字符。正则表达式中的定位符的作用与其它元字符不同,它们并不是用来匹配具体的文本,而是匹配某个具体的位置。

  # 使用示例:

root@main:/# ls -l | grep ^drw
drwxr-xr-x  2 root root  4096 Jan  9 00:25 bin
drwxr-xr-x  3 root root  4096 Jan  9 00:25 boot
drwxr-xr-x 18 root root  2960 Apr 13 13:29 dev
drwxr-xr-x 78 root root  4096 Apr 28 13:21 etc
drwxr-xr-x  2 root root  4096 Nov 19 23:25 home
drwxr-xr-x 15 root root  4096 Apr 13 13:46 lib
drwxr-xr-x  2 root root  4096 Apr 13 13:46 lib64
drwx------  2 root root 16384 Jan  9 00:20 lost+found
drwxr-xr-x  3 root root  4096 Jan  9 00:20 media
drwxr-xr-x  2 root root  4096 Jan  9 00:20 mnt
drwxr-xr-x  2 root root  4096 Apr 13 13:29 opt
drwx------  4 root root  4096 Apr 28 14:28 root
drwxr-xr-x 15 root root   560 Apr 28 14:28 run
drwxr-xr-x  2 root root  4096 Jan  9 00:25 sbin
drwxr-xr-x  2 root root  4096 Jan  9 00:20 srv
drwxrwxrwt  7 root root  4096 Apr 28 14:25 tmp
drwxr-xr-x 10 root root  4096 Jan  9 00:20 usr
drwxr-xr-x 11 root root  4096 Jan  9 00:20 var
 在上面这个例子中,使用正则表达式^drw之后将会将以drw开头的行进行输出,其余则舍弃。
  • 行尾定位符“$”

  与行首定位符的作用恰恰相反,行尾定位符的作用是用来定位文本行的末尾。从语法上讲,行尾定位符的位置也与行首定位符相反,行首定位符位于所作用字符之前,而行尾定位符位于所作用的字符之后。

  # 使用示例:

root@main:/# ls -l | grep bin$
drwxr-xr-x  2 root root  4096 Jan  9 00:25 bin
drwxr-xr-x  2 root root  4096 Jan  9 00:25 sbin

  在上面这个例子中,系统会将所有根目录下、名字以bin结尾的项目打印出来。

  将上述两个定位符号结合使用可实现精准定位:

root@main:/# ls
bin   etc         initrd.img.old  lost+found  opt   run   sys  var
boot  home        lib             media       proc  sbin  tmp  vmlinuz
dev   initrd.img  lib64           mnt         root  srv   usr  vmlinuz.old
root@main:/# ls | grep ^bin$
bin
  • 单个字符匹配“.”

  “.”用来匹配任意单个字符,包括空格,但是不包括换行符“\n”。当用户使用“.”符号后,意味着该未知一定有一个字符,无论是什么字符。

  例如已经当前目录下存在bzexe与gzexe两个目录,可以使用该匹配符号进行筛选:

root@main:/bin# ls | grep .zexe
bzexe
gzexe

限定符 “*”

  星号“*”是正则表达式中的限定符之一。限定符本身不代表任何字符,它是用来指定其前面的一个字符必须重复出现多少次才能满足匹配。“*”表示匹配其签到字符的任意次数,包括0次。

  # 使用示例:

root@main:/etc# ls | grep ^sss*
ssh
ssl
  在这个例子中 ^sss* 表示匹配的文本必须是以s开头,并且需要连续出现两次。
  • 字符集匹配“[]”

  方括号“[]”的功能比较特殊,它是用来指定一个字符集合的,其基本语法为:[abc]。其中a、b和c表示任意的单个字符。只要某个字符在方括号所在的位置上出现了方括号中的任意一个字符,就能满足匹配规则。另外们对于连续的数字或者字母,可以使用连字符来表示一个范围,例如“[a-f]”表示匹配字母表中a到f中的任意一个字母,而“[0-9]”表示匹配任意单个数字。

  # 使用示例:

root@main:/etc# ls | grep ^rc[0-9]
rc0.d
rc1.d
rc2.d
rc3.d
rc4.d
rc5.d
rc6.d


扩展正则表达式

  扩展正则表达式(Extended Regular Expression,ERE)支持比基本正则表达式更多的元字符,但是扩展正则表达式对某些基本正则表达式所支持的元字符并不支持(不包括前述的几种)。若在grep指令下使用需要加上-E参数或者使用egrep指令,-E参数说明如下:

  -E, --extended-regexp     PATTERN is an extended regular expression (ERE)

  • 限定符“+”

  加号“+”的意义与限定符“*”基本相同,但是星号“*”限定前面的字符可以出现任意次,而加号“+”限定前面的字符至少出现一次。

  # 使用示例:

root@main:/etc# ls | egrep "^ss+"
ssh
ssl

  • 限定符“?”

问号“?”是另外一个限定符,它用来限定前面的字符最多只出现一次,即前面的字符可以重复0次或1次。

  # 使用示例:

root@main:/etc# ls | egrep "^ss?"
securetty
security
selinux
services
sgml
shells
skel
ssh
ssl
staff-group-for-usr-local
subgid
subuid
sudoers
sudoers.d
sysctl.conf
sysctl.d
systemd
  • 竖线“|”

  竖线“|”表示多个正则表达式之间“或”的关系。

  # 使用示例:

root@main:/etc# ls | egrep "^ss|^mod"
modprobe.d
modules
modules-load.d
ssh
ssl

Perl正则表达式

  正则表达式是Perl语言的一大特色。Shell中的grep和egrep命令都支持Perl正则表达式。Perl正则表达式的元字符与扩展正则表达式中的元字符大致相同。,扩展正则表达式中元字符在Perl正则表达式中都得到了支持。另外,Perl正则表达式还增加了一些元字符。

  • 数字匹配\d

  符号“\d”匹配0~9中的任意一个数字字符,等价于表达式“[0-9]”。

  # 使用示例:

root@main:/etc# ls | grep -P "^rc\d"
rc0.d
rc1.d
rc2.d
rc3.d
rc4.d
rc5.d
rc6.d
  • 非数字匹配符\D

  符号“\D”和符号“\d”的作用恰好相反,后者会是匹配一个0~9之间的单个数字字符,而前者则匹配一个非数字字符。“\D”等价于表达式“[^0-9]”。

  • 空白字符匹配\s

  符号“\s”匹配任何空白字符,包括空格、制表符以及换页符等,等价于表达式“[\f\n\r\t\v]”

  • 非空白字符匹配\S

  符号“\S”匹配任何非空白字符,等价于表达式“[^\f\n\r\t\v]”

正则表达式字符集

在正则表达式中,普通字符集中的字符只表示它们的表面涵义,不对其他字符产生影响。正则表达式的最简单的形式就是只由普通字符集中的字符组成,不包含元字符。正则表达式的字符集通常使用方括号表达式表示,例如:

[cC]hina
[^hello]
[a-zA-Z]
[0123456789]
[0-9]

  第一个表达式表示匹配“china”或者“China”这2个字符串;第2个表达式表示不匹配“hello”这个字符串;第3个表达式表示匹配所有的大小写字母;第4、5个表达式表示匹配所有的个位数字。

# 使用示例:

root@main:/etc# ls | grep "rc[0-9].d"
rc0.d
rc1.d
rc2.d
rc3.d
rc4.d
rc5.d
rc6.d
  另还有POSIX字符类(感谢这位朋友的整理): 正则表达式——POSIX字符类

猜你喜欢

转载自blog.csdn.net/ZHISHAN_IoT/article/details/80129113