正则表达式是描述一组字符串特征的模式,用来匹配特定的字符串。
各种程序设计语言,各种编辑器大都支持正则表达式。
从在线测试开始
首先介绍一下regexpal网站,在浏览器地址栏输入:https://www.regexpal.com/,即可看到如下图所示的网站页面。
页面中,上边写正则表达式,下边写要尝试的例子,通过例子进行测试,检验正则表达式是否匹配。
也可以使用regexr,在浏览器器地址栏输入:https://regexr.com/,即可进入网站页面,如下图所示:
其功能都类似,进行正则表达式的测试。
类似的网站还有很多,可以通过百度搜索。
基本用法
用字符组来匹配数字
方括号[]中的内容称为字符组,有时也叫字符集,例如:[0-9]表示“匹配0到9范围内的任意数字”,[a-z]表示“匹配任意小写字母”,同样地,[A-Z]表示“匹配任意大写字母”,当然,也可以采用穷举法,[abc123ABC]表示“匹配这里的任意字符”,之外的字符不匹配,如d就不匹配。
[aeiou]匹配小写元音字母
[^aeiou]不匹配小写元音字母
[\u0067]匹配Unicode字符
[\115]用八进制数匹配字符
使用字符组简写形式
\d像[0-9]一样匹配任意数字
\D匹配非数字字符,与[^0-9\]或[^\d]
等效
\w匹配所有的单词字符(前提是勾选global选项),与[_a-zA-Z0-9]
等效;与\D的区别是\D会匹配空格、标点符号等字符,\w则不会
\W匹配空格、标点符号以及其他非字母、非数字字符,与[^_a-zA-Z0-9]
等效
\a报警符
\0空字符
\s匹配空白符(空格)
\S非空白符(空格)
\t制表符
\n换行符
\r回车符
\f换页符
\b单词边界
\B非单词边界
匹配任意字符
.(点)是一个通配符,可以匹配任意字符(但一般不匹配行起始符)
选择操作
选择操作可在多个可选模式中匹配一个。
(the|The|THE)匹配所有的the、The、THE
分组
()之间的内容就是一个分组
捕获分组
\1或$1引用第一个捕获的分组
非捕获分组
不想引用分组时,就可以定义非捕获分组。
(?:the|The),这样,当你使用$1引用时,就无效
选项
选项 | 描述 | 支持平台 |
---|---|---|
(?d) | Unix中的行 | Java |
(?i) | 不区分大小写 | PCRE、Perl、Java |
(?J) | 允许重复的名字 | PCRE |
(?m) | 多行 | PCRE、Perl、Java |
(?s) | 单行(dotall) | PCRE、Perl、Java |
(?u) | Unicode | Java |
(?U) | 默认最短匹配 | PCRE |
(?x) | 忽略空格和注释 | PCRE、Perl、Java |
(?-…) | 复原或关闭选项 | PCRE |
(?i)the匹配所有的the,不区分大小写
子模式
子模式就是指分组中的一个或多个分组,就是模式中的模式。多数情况下,子模式中的条件能得到匹配的前提是前面的模式得到匹配,但也有例外。
(t|T)h(e|eir)匹配the、The、their、Their,后面的匹配,依赖前面的匹配
量词
{}中的数字表示待查找字符出现的次数,包含数字的花括号是一种量词
{3,4}3表示最小数量,4表示最大数量
?表示“零个或一个”
+表示“一个或多个”
*表示“零个或多个”
{n}精确匹配n次
{n,}匹配n次或更多次
{m,n}匹配m至n次
{0,1}与?相同
{1,}与+相同
{0,}与*相同
边界
^匹配行或字符串的起始
$匹配行或字符串的结尾
\b单词边界,有的应用中使用\<\>
来指定单词的开头和结尾
\B非单词边界
使用元字符的字面值
\Q\E之间的字符集匹配字符串字面值,例如:\Q.\E
表示.
(点),不再匹配任意字符了。
匹配行
.*
或.+
匹配一行内容,如果是global的话,将匹配所有行
更进一步
正则表达式非常灵活,基本规则有限,至于你能不能挖掘出其独特的应用,就看你的实践了。