正则表达式是文本搜索的一个利器,掌握它定会提高你的工作效率。
要使用正则表达式就必须知道有哪些元字符以及它们所代表的意义,这里我就不再对每个元字符做说明了,假设你已经了解了这些知识,如果还不了解可以参考网上的一些资料。
以下所有示例用的是一个在线的正则表达式测试工具来验证的,地址是
https://tool.oschina.net/regex/
1、匹配指定数量字符
比如11位的手机号:[0-9]{11},匹配结果如下图:
大括号里的数字表示重复前面匹配的数量,有以下几种写法
- {k} 表示重复次数k
- {m,} 表示重复次数不小于m
- {,n} 表示重复次数不大于n
- {m,n} 表示重复次数不小于m且不大于n
我用的这个测试工具不支持上面四种所有写法,只支持1,2,4这三种写法
2、匹配至少1个字符
比如匹配数字与字母相互交叉文本中的所有字母部分:[a-zA-Z]+,匹配结果如下图:
这种写法与[a-zA-Z]{1,}等效,得到同样结果,如下图所示:
还有一个可以表示匹配数量的元字符是*,不过它表示大于等于0个匹配,也就是说以下这种写法[a-zA-Z][a-zA-Z]* 也与 [a-zA-Z]+ 是等效的,得到同样结果,如下图所示:
3、匹配另一个正则表达式结果指定数量的文本
这种匹配其实与前两种写法上没有多大区别,唯一的区别就是需要重复的文本不再是单个字符,而是其它正则表达式匹配的结果,比如匹配ip地址:([0-9]{1,3}\.){3}[0-9]{1,3},匹配结果如下图:
4、引用前一个正则表达式匹配结果
通过\n的方式可以引用第n个分组,比如查找不相邻的两个重复的单词:([a-zA-z]{5,}).+\1,匹配结果如下图:
5、匹配开头是指定字符的文本
比如匹配开头是数字的文本:^[0-9]+,匹配结果如下图:
6、匹配结尾是指定字符的文本
比如匹配结尾是数字的文本:[0-9]+$,匹配结果如下图:
7、前向肯定与否定预匹配
比如搜索后面必须紧跟hello这个单词的数字:[0-9]+(?=hello),匹配结果如下图:
比如搜索后面一定不能紧跟hello这个单词的数字:[0-9]+(?!hello),匹配结果如下图:
8、后向肯定与否定预匹配
比如搜索前面必须是数字的英文单词:(?<=[0-9]+)[a-zA-Z]+,匹配结果如下图:
比如搜索前面一定不是数字的英文单词:(?