学习之前,可以暂时把正则表达式理解为功能更高级的通配符(wildcard)。
在Shell里,可以通过通配符来匹配一些具有相似模式的字符串,比如下面的命令:
$ ls * # 列举所有的文件 $ ls *.c # 列举所有以".c"结尾的文件 $ ls 108?.c # 列举以108开头,后面跟一个任意字符,再以".c"结尾的文件 $ ls 108[56].c # 列举以108开头,后面跟5或6,再以".c"结尾的文件 $ ls 108[0-8].c # 列举以108开头,后面跟0~8中的任意一个,再以".c"结尾的文件 $ ls l08[!0].c # 列举以108开头,后面跟一个不为0的字符,再以".c"结尾的文件 |
其中,'*'、'?' 等就被称为通配符,因为他们可以匹配一个或多个符合规则的字符,具体的,这些通配符的作用如下:
通配符的作用就是用于字符串的匹配,但是在遇到比较复杂的匹配需求时,通配符就无能为力了,比如像“匹配以test开头,后面跟1个或多个数字,再跟3个非数字的字符,再以abcef中的一个或多个字符结尾的字符串”这种需求,或是匹配一个邮箱地址,只使用通配符的话就无法实现,这时,正则表达式就可以派上用场了。
正则表达式是比通配符功能更加强大的用于字符串模式匹配的工具,具体地,正则表达式可以实现以下功能:
使用正则表达式的最大问题是正则表达式有很多的流派(正则表达式“派别”简述 - Keep Coding),也就是在实现相同功能的情况下,不同流派的正则表达式可能有不同的写法。具体来说,正则表达式可以分为以下几类:
关于这几个流派,在编程语言中,一般使用PCRE,比如Perl, Boost.Regex, java.util.regex。BRE和ERE一般用于POSIX程序,比如sed, awk, grep等,其中sed默认使用BRE,awk默认使用ERE,而grep则可以通过选项选择使用哪种流派的正则表达式。关于这几个流派的正则表达式差异可以参考:正则表达式 BRE ERE PCRE 区别 | IT日记,本篇主要介绍PCRE。
和通配符一样,在正则表达式里,也存在用于模式匹配的元字符
区分多种不同的正则表达式类型,搞清楚它们之间的区别和应用场景,以及放在代码中的转义字符处理,特别是C++中构造正则表达式时的反人类的转义写法。
几个实例,
notepad++中替换文本
匹配UUID
匹配邮箱