在下面的代码中,我尝试使用$1来引用第一个子匹配:
#include <iostream>
#include <string>
#include <regex>
using namespace std;
int main()
{
string str {"1-2-3 4-5-6 7-8-9"};
int r = 1;
str = regex_replace(str, regex{R"((\d*-\d*-)\d*)"}, "$1" + to_string(r));
cout << str << "\n";
return 0;
}我期望的是:
1-2-1 4-5-1 7-8-1但是它不起作用,因为传递给regex_replace()的实际格式字符串是$11,就好像我试图引用第11次子匹配一样。
那么,在使用regex_replace()时,返回子匹配的正确方法是什么?该子匹配后面跟着格式字符串中的另一个数字?
我试过使用${1},但它不适用于我尝试过的任何主流实现。
发布于 2015-01-05 16:16:20
根据标准N3337,第28.5.2节,表139:
format_default:当正则表达式匹配被新字符串替换时,新字符串应使用ECMA-262中的ECMAScript替换函数使用的规则构造,第15.5.4.11 String.prototype.replace部分。此外,在搜索和替换操作期间,将查找和替换正则表达式中所有不重叠的事件,不匹配表达式的输入部分将不改变地复制到输出字符串中。
根据ECMA-262第15.5.4.11部分String.prototype.replace,表22
$nn:nn捕获,其中nn是介于01到99之间的两位数的十进制数.如果nn≤m和nnth捕获未定义,则使用空字符串。如果是nn>m,则结果是实现定义的。
因此,在$之后最多可能有两个十进制数,这是指匹配组,因此您可以使用
"$01" + to_string(r)https://stackoverflow.com/questions/27783017
复制相似问题