你的位置:首页 > 信息动态 > 新闻中心
信息动态
联系我们

C++ Primer 5th笔记(chap 17 标准库特殊设施)子表达式subexpression

2021/11/5 6:48:35

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();
}