srk*_*ing 13 c++ regex regex-group c++11
我的regex_replace表达式在替换字符串中的'0'字符前使用组$ 1,如下所示:
#include <iostream>
#include <string>
#include <regex>
using namespace std;
int main() {
regex regex_a( "(.*)bar(.*)" );
cout << regex_replace( "foobar0x1", regex_a, "$10xNUM" ) << endl;
cout << regex_replace( "foobar0x1", regex_a, "$1 0xNUM" ) << endl;
}
Run Code Online (Sandbox Code Playgroud)
输出是:
xNUM
foo 0xNUM
Run Code Online (Sandbox Code Playgroud)
我试图在foo0xNUM没有中间空格的情况下获得输出.
如何保护替换字符串中下一个字符的组名$ 1?
Guv*_*nte 11
您可以指定$n或$nn引用捕获的文本,因此您可以使用$nn格式(此处$01)来避免抓取0.
cout << regex_replace( "foobar0x1", regex_a, "$010xNUM" ) << endl;
Run Code Online (Sandbox Code Playgroud)
Guvante 为这个问题提供了解决方案.
但是,是否根据规范明确定义了行为?
从结论开始.是的,该解决方案具有明确定义的行为.
format_default指定用于解释格式字符串的ECMA规则的文档指向ECMA-262的第15.5.4.11节.
$n第n次捕获,其中n是1到9范围内的单个数字,
$n后面没有十进制数字.如果n≤m并且第n次捕获未定义,请改用空字符串.如果n> m,则结果是实现定义的.
$nn第n次捕获,其中nn是01到99范围内的两位十进制数.如果nn≤m且未定义第n个捕获,则使用空字符串.如果nn> m,则结果是实现定义的.
变量m在前一段中的同一部分中定义:
[...]设m为左侧捕获括号的数量
searchValue(使用NcapturingParens15.10.2.1中的规定).
"$10xNUM"回到问题中的代码:
cout << regex_replace( "foobar0x1", regex_a, "$10xNUM" ) << endl;
Run Code Online (Sandbox Code Playgroud)
由于$1之后是0,它必须被解释为第二条规则$nn,因为第一条规则禁止任何数字跟随$n.但是,由于模式只有2个捕获组(m = 2)和10> 2,因此行为是根据规范实现定义的.
通过比较Firefox 37.0.1中功能相同的JavaScript代码的结果,我们可以看到implementation-defined子句的效果:
> "foobar0x1".replace(/(.*)bar(.*)/g, "$10xNUM" )
< "foo0xNUM"
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,Firefox决定将其解释$10为获取第一个捕获组的值$1,然后是固定字符串0.根据$nn条款in 条款,这是一个有效的实现.
"$010xNUM"与上面相同,使用了$nn子句,因为$n子句禁止遵循任何数字.由于01 in $01小于捕获组的数量(m = 2),因此行为是明确定义的,即在替换中使用捕获组1的内容.
因此,Guvante的答案将在任何投诉C++编译器上返回相同的结果.
| 归档时间: |
|
| 查看次数: |
1784 次 |
| 最近记录: |