第十七章 17.3.3节练习

练习17.19

为什么可以不先检查m[4]是否匹配了就直接调用m[4].str()?

解答:

在valid的参数列表中,传入的是smatch类型的参数。

所以,这里可以确定的是,这个参数是与正则表达式匹配的。

如果m[4]没有匹配到,那么这里的str()返回的就是一个空的字符串。

所以,不必先检查m[4]是否匹配。


练习17.20

编写你自己版本的验证电话号码的程序。

解答:

这里需要实现的是valid函数。

根据中国的/电话号码:(区号)(七位或八位电话号码)

可以用这个正则表达式:"(\\()?(\\d{4})?(\\d{3})?(\\))?(\\d{8})?(\\d{7})" 有些长应该可以更加简化的。

与书中类似,看是否会匹配区号。

bool valid(const smatch& m){
	if (m[1].matched){
		return m[4].matched && (m[2].matched || m[3].matched);
	}
	else{
		return !m[4].matched && (!m[2].matched && !m[3].matched);
	}
}

练习17.21

使用本节中定义的valid函数重写8.3.2节(第289页)中的电话号码程序。

解答:

这里只需要将本节实现的valid的函数将之前的替换掉就可以了。

不过这里不想去改动之前的实现,所以正则判别也需要在valid中进行。

bool valid(const string& str){
	string patten = "(\\()?(\\d{4})?(\\d{3})?(\\))?(\\d{8})?(\\d{7})";
	regex r(patten);
	smatch m;
	regex_search(str, m, r);

	if (m[1].matched){
		return m[4].matched && (m[2].matched || m[3].matched);
	}
	else{
		return !m[4].matched && (!m[2].matched && !m[3].matched);
	}
}
与此函数类似。


练习17.22

重写你的电话号码程序,使之允许在号码的三个部分之间防止任意多个空白符。

解答:

在三个部分之间加上 

([ ]*)?

即可。


练习17.23

编写查找邮政编码的正则表达式。一个美国邮政编码可以由五位或九位数字组成。前五位数字和后四位数字之间可以用一个短横线分隔。

解答:

"(//d{5})([-])?(//d[4])?"


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值