1.简述
- 正则表达式( Regular Expression, regexp )是一种描述字符串特征的语法规则 ,用于验证各种字符串是否匹配( Match)这个特征,进而实现高级的文本查找、替换、截取内容等操作 。 例如,要在大量的文本中找 出符合某个特征的字符串,就将这个特征按照正则 表达式的语法写出来,形成一个用于计算机程序识别的模式( Pattern),然后计算机程序就会根据这个模式到文本中进行匹配。
- 正则表达式的形成与发展有着悠久的历史,在各种计算机软件中都有广泛应用 。 例如,在操作系统( UNIX 、 Linux 等)、编程语言( C 、 C ++、 Java 、 PHP 、 Python,] avaScript 等)、服务器软件( Apache 、 Nginx)的使用中都会遇到正则表达式。
2.入门语法
背景介绍
POSIX 和 Perl 语法。grep 命令支持 POSIX 和 Perl 两种正则表达式语法,默认情况下是 POSIX BRE 语法,指定选项 -E 可以切换到 POSIX ERE 语法,指定选项-P 可以切换到 Perl 语法(选项 E 和 P不可同时使用)。以下命令讲解基于Perl语法。
1.grep命令
grep 支持对来自标准输入、管道( pipe )输入,以及文本文件的内容进行正则表达式搜索
1)标准输入
[root@ localhost ~]$grep --color 'hello'
上述示例中, grep 命令的 co l or 选项表示以彩色标注出匹配到的内容,参数 hello 是一个符合正则表达式语法的匹配模式,用于匹配内容 。该行命令执行后,在光标显示处利用键盘输入 hello world 或其他任意内容后,按回车键提交给 grep 进行匹配,结果如下所示。
hello world
hello world
2)管道输入方式
管道是 Linux 中支持的一种通信机制,其作用是将一个程序的输出作为另一个程序的输入 。 管道的符号是|,通过这个符号连接前后多个命令,具体示例如下。
[root@centos test]# cat word.txt
hello world
[root@centos test]# cat word.txt |grep --color llo
hello world3)文件方式
grep 命令的第 2 个参数是可选参数,用于读取指定的文件内容进行正则模式匹配。以读取指定文件 word.txt 为例,具体示例如下。
[root@centos test]# grep wor word.txt
hello world
2.元字符、文本字符和转义字符
一个完整 的正则表达式由元字符和文本字符两部分构成。其中,元字符就是具有特殊含义的字符,如前面提到的"^" "$" "." "*",文本字符就是普通的文本,如字母和数字等。正则表达式定义许多元字符用于实现复杂匹配,而若要匹配的内容是这些字符本身时,就需要在前面加上转义字符“\”,如“\^”。"\"本身也属于元字符,用"\\"转义 。
1)转义字符的使用。
[root@centos test]# grep --color '[\^\$\\\.]'
12$fd^34.45\
12$fd^34.45\2)分组
在正则表达式中还支持分组(又称为子模式、子匹配),用小括号"()"来实现 。 括号用于嵌套一个子模式,如下面的示例实现了匹配 aa 出现了3次的情况 。
[root@centos test]# grep -P --color '(aa){2}'
1234aaaadfg
1234aaaadfg3)在单引号内匹配单引号,使用\x27
[root@centos test]# grep --color -P '\x27'
asss'dd
asss'dd
3.语法规则
1.定位符
1)定位符注意:匹配空行可以使用^$
定位符 说明 示例 匹配结果 ^ 匹配字符串开始的位置 ^hello helloworld $ 匹配字符串结束的位置 world$ helloworld 2)选择符,|
[root@centos test]# grep -P --color 'java|PHP'
who is the best language java or PHP
who is the best language java or PHP3)字符范围
示例 说明 匹配结果 [abc] 匹配字符a,b,c abcdef [^abc] 匹配不是a,b,c的字符 abcdef [a-z] 匹配字母a~z范围内的字母 abcdef 4)点字符和限定符
字符 说明 示例 结果 . 匹配一个任意字符 a.d 可匹配 add asd afd ? 匹配前面的字符0次或1次 he?p 可匹配hep heep + 匹配前面的字符一次或多次 w+w 可匹配www wwww * 匹配前面的字符0次或多次 go*gle 可匹配 gogle google gooogle ... {n} 匹配前面的字符n次 go{1}gle 只可以匹配google
4.应用案例
1)验证文件扩展名
只允许访问html,css,jpg扩展名的文件
^.*?\.(html|css|jpg)$
2)验证IP地址
^(([1-9]?\d|1\d{2}|2[0-4]\d|5[0-5]))\.){3}([1-9]?\d|1\d{2}|2([0-4]\d|5[0-5]))$
3)验证日期格式
^[1-9]\d{3}-([1-9]|1[0-2])-([1-9]|[1-2]\d|3[01])$