1. 正则表达式的模式通常包含一个或多个子表达式
通常用括号表示子表达式
eg. r 有两个子表达式: 第一个是点之前表示文件名的部分, 第二个表示文件扩展名
regex r ("([[:alnum:] ]+)\\ • (cpp丨cxx丨cc ) $", regex::icase);
1.1 匹配对象除了提供匹配整体的相关信息外 ,还提供访问模式中每个子表达式的能力
子匹配是按位置来访问的。 第一个子匹配位置为 0. 表示整个模式对应的匹配, 随后是每
个子表达式对应的匹配。
eg.
//模式中第一个子表达式, 即表示文件名的子表达式,其位置为1
//文件扩展名对应的子表达式位置为2
//如 果 文 件 名 为 foo.cpp , 则 results.str 将 保 存 foo.cpp ;
//results.str(1)将保存foo:
//results.str(2)将保存cpp
if (regex_search(filename, results, r))
cout << results.str(1) << endl; // .str(1)获取第一个子表达式匹配结果
1.2 子表达式用于数据验证
子表达式的一个常见用途是验证必须匹配特定格式的数据。
step1. 将用一个正则表达式找到可能是电话号码的序列
step2. 调用一个函数来完成数据验证
1.3 子匹配操作
操作 | 描述 |
matched | 一个public bool数据成员,指出了此ssub_match是否匹配了public数据成员, |
first | 指向匹配序列首元素和尾后元素位置的迭代器,若未匹配 |
second | 则first和second是相等的 |
length() | 匹配的大小。若matched为false,则返回0 |
str() | 返回一个包含输入中匹配部分的string。若matched为false,则返回空string |
s = ssub | 将ssub_match对象ssub转化为string对象s |
bool valid(const smatch& m)
{
//如果区号前有一个左括号
if (m[1].matched)
//则区号后必须有一个右括号,之后紧跟剩余号码或一个空格
return m[3].matched && (m[4].matched == 0 || m[4].str() == " ");
else
//否则,区号后不能有右括号
//另两个组成部分间的分隔符必须匹配
return !m[3].matched && m[4].str() == m[6].str();
}