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