我需要一些使用正则表达式格式化字符串的帮助。我有一个类型
的字符串(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
来完成这项工作,但却无法解决这个问题。
感谢所有帮助。
答案 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;
}