使用正则表达式进行条件替换

时间:2016-12-22 17:47:59

标签: regex c++11

我需要一些使用正则表达式格式化字符串的帮助。我有一个类型

的字符串
  

(33,2),(44,2),(0,11)

我必须将此字符串重新格式化为以下

  

(2),(2),(0,11)

即,除了最后一次出现之外,从输入中删除(\\([[:digit:]]+\\,)

我尝试了以下代码,但它取代了所有实例。

#include <iostream>
#include <string>
#include <regex>

int main ()
{
  std::string s ("(32,33),(63,22),(22,1)");
  std::regex e ("[[:digit:]]+\\,"); 
  std::string result;

  std::regex_replace (std::back_inserter(result), s.begin(), s.end(), e, "$2");
  std::cout << result;

  return 0;
}

我知道我需要使用std::sregex_iterator来完成这项工作,但却无法解决这个问题。

感谢所有帮助。

1 个答案:

答案 0 :(得分:1)

只有在(后面跟着这些数字时才能匹配这些数字:

[[:d:]]+,(?=.*\()

<强>详情:

  • [[:d:]]+ - 一位或多位
  • , - 逗号
  • (?=.*\\() - 在除了换行符之外的任何0 +字符之后需要(的正向前瞻。

此处的正面预测可以替换为否定的(?![[:d:]]+\\)$)预测,如果数字+ ,的所有匹配都会失败,如果它们后面跟着1+位+ )字符串。

请参阅C++ demo

#include <iostream>
#include <string>
#include <regex>

int main ()
{
  std::string s ("(32,33),(63,22),(22,1)");
  std::regex e ("[[:d:]]+,(?=.*\\()"); 
  std::string result;

  std::regex_replace (std::back_inserter(result), s.begin(), s.end(), e, "$2");
  std::cout << result;

  return 0;
}