c++ - Regex to replace all occurrences between two matches -


i using std::regex , need search , replace.

the string have is:

begin foo spaces , maybe new line( text replace foo foo bar foo, keep rest ) more text not replace foo here 

only stuff between begin .... ( , ) should touched.

i manage replace first foo using search , replace:

(begin[\s\s]*?\([\s\s]*?)foo([\s\s]*?\)[\s\s]*)  $1abc$2 

online regex demo

online c++ demo

however, how replace 3 foo in 1 pass? tried lookarounds, failed because of quantifiers.

the end result should this:

begin foo spaces , maybe new line( text replace abc abc bar abc, keep rest ) more text not replace foo here 

question update:

i looking pure regex solution. is, question should solved changing search , replace strings in the online c++ demo.

i have come code (based on benjamin lindley's answer):

#include <iostream> #include <regex> #include <string> int main() {     std::string input_text = "my text\nbegin foo 14 spaces , maybe \nnew line(\nsome text replace foo foo bar foo, keep rest\n)\nsome more text not replace foo here";     std::regex re(r"((begin[^(]*)(\([^)]*\)))");     std::regex rxreplace(r"(\bfoo\b)");     std::string output_text;     auto callback = [&](std::string const& m){         std::smatch smtch;         if (regex_search(m, smtch, re)) {             output_text += smtch[1].str();             output_text += std::regex_replace(smtch[2].str().c_str(), rxreplace, "abc");         } else {             output_text += m;         }     };      std::sregex_token_iterator         begin(input_text.begin(), input_text.end(), re, {-1,0}),         end;     std::for_each(begin,end,callback);      std::cout << output_text;     return 0; } 

see ideone demo

i using 1 regex find matches of begin...(....) , pass them callback function group 2 processed further (a \bfoo\b regex used replace foos abcs).

i suggest using (begin[^(]*)(\([^)]*\)) regex:

  • (begin[^(]*) - group 1 matching character sequence begin followed 0 or more characters other (
  • (\([^)]*\)) - group 2 matching literal ( followed 0 or more characters other ) (with [^)]*) , literal ).

Comments

Popular posts from this blog

php - Wordpress website dashboard page or post editor content is not showing but front end data is showing properly -

How to get the ip address of VM and use it to configure SSH connection dynamically in Ansible -

javascript - Get parameter of GET request -