【问题标题】:Can I use $1 in regex_replace?我可以在 regex_replace 中使用 $1 吗?
【发布时间】:2011-10-11 07:45:06
【问题描述】:

通过阅读regex_replace (28.11.4) 的 FCD,我只能猜测该函数还可以使用部分原始字符串进行替换?我可以不用我的 gcc 测试,这样对吗?

using namespace std;
regex rx{ R"((\d+)-(\d+))" }; // regex: (\d+)-(\d+)
cout << regex_replace("123-456", rx, "b: $2, a:$1");
// "b: 456, a:123"

如您所见,我假设 $1$2 指的是 "()" 捕获组(而不是像其他地方一样的 \1\2)。

更新。所以,我想这是一个由两部分组成的问题

  • 是否支持在替换文本中使用这种捕获组
  • 默认的 ECMAScript 语法是使用 $n 还是 \n

【问题讨论】:

    标签: c++ regex replace c++11


    【解决方案1】:

    C++ 2011 FDIS 中的表 139 列出了两个常量,它们可用于影响 regex_replaceformat_defaultformat_sed 中用于格式字符串的规则。 format_default 被描述为使用“ECMA-262 中 ECMAScript 替换函数使用的规则,第 15.5.4.11 部分 String.prototype.replace。”该标准确实表明使用$ 进行反向引用。见:ECMA-262

    使用format_sed 标志改为使用POSIX 中sed 实用程序的规则。 Sed 似乎不支持$ 反向引用。

    【讨论】:

    • 很好地指出并针对标准。看来boost解释是错误的。我想我也会在那里征求意见。
    【解决方案2】:

    我会感到惊讶; $ 不在基本源字符集 (2.3) 中。 TR1 的 Dinkumware documentation 声明它确实是 \1,并且它依赖于方言。

    【讨论】:

    • 但是 $'s 在字符串中。
    • 是的,参见 2.14.5。字符串文字可以包含较少的字符(没有 \、" 或换行符,因为它们具有特殊含义)。您需要将其写为 "\u0024"
    • 对不起,我想我的问题应该是一个两部分:这个功能是否可用,它是否与$ 或``一起使用?
    • @towi:我链接的文档有什么问题吗? \1 应该可以工作(即使在 BRE (POSIX) 方言中)。
    • @MSalters:嗯,TR1 并不完全是 FCD。所以我想确定。例如,据我所知,“部分匹配”功能已被删除。此外,您的链接指向“反向引用”,它是“模式”而不是“替换”——查看该页面的底部,您会找到“格式标志”。在那里你可以找到 "$n"... 因此,我的猜测是它 is 实际上是 "$1" 用于替换文本。附加链接,提升:boost.org/doc/libs/1_32_0/libs/regex/example/snippets/…,查看$&amp;format_string 中的用法
    猜你喜欢
    • 1970-01-01
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多