但是很多情况下,光是返回一个是否匹配的bool量是不够的,我们需要拿到匹配的子字符串。那么就需要在模式字符串中将匹配字符串分组,参考【匹配字符串的基本规则】第12点。再将smatch传入到regex_search中,就可以获得满足每个子分组的字符串。
smatch m; bool found = regex_search(str, m, e); for (int n = 0; n < m.size(); ++n) { cout << "m[" << n << "].str()=" << m[n].str() << endl; }
替换也是基于模式字符串在分组情况下完成的。
cout << regex_replace(str, e, "$1 is on $2");
此时,会在满足分组1和分组2的字符串中间加上“ is on”。
以上三个函数有很多版本的重载,可以满足不同情况下的需求。
实战
要求:找出满足sectionA("sectionB")或者sectionA ("sectionB")的模式字符串。且分离出sectionA、sectionB。sectionA和sectionB不会出现数字,字符可大小写,至少有一个字符。
分析:根据要求,大致可分为两个部分,也就是sectionA和sectionaB。这是就需要用到分组。
第一步:写出满足section情况的模式字符串
[a-zA-Z]+
第二步:在sectionA和sectionB中可能会出现空格。暂且假设至多有1个空格
\\s?
将以上两个情况组合起来,也就是能满足我们需求的模式字符串。但是如何组织才能让其分为两组呢?
[a-zA-Z]+\\s[a-zA-Z]+
上面这种写法肯定不对的,根据分组规则,需要将分组以()进行区分
regex e("([a-zA-Z]+)\\s?\\(\"([a-zA-Z]+)\"\\)");
此时,在\\s?后面的\\(\"是为了满足sectionB外层的引号和括号进行的转义。
以上完成后,可先用regex_match进行匹配,如果匹配,那么继续使用regex_search对字符串进行查找
if (regex_match(str, e)) { smatch m; auto found = regex_search(str, m, e); for (int n = 0; n < m.size(); ++n) { cout << "m[" << n << "].str()=" << m[n].str() << endl; } } else { cout << "Not matched" << endl; }
对象m数组的第一个字符串是满足需求的整个子串,接下来才是满足分组1、分组2的子串。
总结
以上所述是小编给大家介绍的正则表达式模式匹配字符串基础知识,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
您可能感兴趣的文章: