我正在使用带有 std::regex 的 C++20(Visual Studio 2022)(尽管最近由于这样的问题,我不得不切换到 boost::regex 来获得非递归实现)。
我有一个很长的正则表达式,其中包含几个捕获组。这是一个大大简化的示例:
string s("123 hello 456 a,b,c 789 1:2:3");
regex r(R"regex(\d+ (\w+) \d+ ([\w,]+) \d+ ([\w:]+))regex");
smatch m;
regex_match(s, m, r);
// at this point m[1] == "hello", m[2] == "a,b,c", m[3] == "1:2:3"
我想修改和替换每个捕获组,例如假设我想反转每个捕获组以生成此字符串:
"123 olleh 456 c,b,a 789 3:2:1"
推荐的实现方法是什么?理想情况下,我希望以std::regex
和都boost::regex
支持的方式实现。如果它能大大简化事情,那么针对 boost 的答案将在这个特定情况下对我有所帮助。
请注意,有很多示例多次匹配单个正则表达式模式,并且每次您都可以修改匹配的文本并将其替换为修改后的文本。我的情况不同,因为我有一个包含多个捕获组的长正则表达式。我想对每个捕获组应用不同的逻辑来计算其替换。
还请注意,逻辑不是每个捕获组独立的函数。所以我想做这样的事情(继续上面的代码):
// at this point m[1] == "hello", m[2] == "a,b,c", m[3] == "1:2:3"
string s1 = m[1], s2 = m[2], s3 = m[3];
compute_replacements(s1, s2, s3); // s1,s2,s3 are modified by this function
string result = this_question_is_about_what_to_put_here(s, r, s1, s2, s3);
// result == original string with each capture group replaced by s1, s2, s3 respectively
我使用每个匹配给出的位置和长度来执行字符串替换,如下所示:
这种方法对我来说最有效,因为它不需要我向原始正则表达式添加额外的捕获组来捕获整个字符串。