练习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])?"