接上一篇的正则表达式的常规语法后,对一些常见的正则表达式匹配问题进行解析,顺带练习一下。
第一题:正则表达式匹配IP地址
IP地址由4个字节组成,每两个字节之间以.隔开,比如121.156.0.1。每一位的范围是{0,255},因此除了正确匹配数字和数字的个数外,还要注意每一位的取值范围。
常见的做法如下所示:
1. 是将每一位拆分成三部分{0,200},{200,249},{250,255}。分别为[01]?\d\d?,2[0-4]\d,25[0-5]
2. 然后使用分支匹配方法|来连接三部分,后面再加一个.号,构成一个分组。( ( [01]?\d\d? |2[0-4]\d | 25[0-5] )\. )
3. 重复前面的分组三次。( ( [01]?\d\d? | 2[0-4]\d | 25[0-5] )\. ) {3}
4. 最末一位以同样的拆分表示法,只表示出数字就可以了。( ( [01]?\d\d? | 2[0-4]\d | 25[0-5] )\. ) {3}( [01]?\d\d? | 2[0-4]\d | 25[0-5] )
使用C++11进行正则表达式匹配,需要添加#include <regex>
bool isIPValid(const string& ip)
{
regex pattern(("((([01]?\\d\\d?)|(2[0-4]\\d)|(25[0-5]))\\.){3}(([01]?\\d\\d?)|(2[0-4]\\d)|(25[0-5]))"));
return regex_match(ip,pattern);
}
第二题:匹配手机号和带区号的固话号码
匹配以1开头,第二位(从左开始)为3,4,5,8中的一个,其余为0到9的数字的手机号码:1[3458]\d{9}
匹配形式如:0511-4405222 或者021-87888822 或者 021-44055520-555 或者 (0511)4405222的正则表达式:( (\d{3,4}) |(\d{3,4}-))?\d{7,8}( -\d{3,4})*
第三题:匹配邮箱地址
合法的邮箱地址的要求:只包含一个@;第一个字符不能是@或.;结尾不能是@或.;允许出现_,但是只能放在@前,不能和@连起来
原文链接:https://www.f2er.com/regex/362646.html