首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当使用regex_replace()时,当子匹配后面直接跟着格式字符串中的另一个数字时,有什么不正确的方法来反向引用子匹配呢?

当使用regex_replace()时,当子匹配后面直接跟着格式字符串中的另一个数字时,有什么不正确的方法来反向引用子匹配呢?
EN

Stack Overflow用户
提问于 2015-01-05 15:52:02
回答 1查看 459关注 0票数 1

在下面的代码中,我尝试使用$1来引用第一个子匹配:

代码语言:javascript
复制
#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;
}

我期望的是:

代码语言:javascript
复制
1-2-1 4-5-1 7-8-1

但是它不起作用,因为传递给regex_replace()的实际格式字符串是$11,就好像我试图引用第11次子匹配一样。

那么,在使用regex_replace()时,返回子匹配的正确方法是什么?该子匹配后面跟着格式字符串中的另一个数字?

我试过使用${1},但它不适用于我尝试过的任何主流实现。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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,则结果是实现定义的。

因此,在$之后最多可能有两个十进制数,这是指匹配组,因此您可以使用

代码语言:javascript
复制
"$01" + to_string(r)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27783017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档