Jendas
Jendas

Reputation: 3579

c++ regex search pattern not found

Following the example here I wrote following code:

using namespace std::regex_constants;
std::string str("{trol,asdfsad},{safsa, aaaaa,aaaaadfs}");
std::smatch m;
std::regex r("\\{(.*)\\}");   // matches anything between {}

std::cout << "Initiating search..." << std::endl;
while (std::regex_search(str, m, r)) {
    for (auto x : m) {
        std::cout << x << " ";
    }
    std::cout << std::endl;
    str = m.suffix().str();
}

But to my surprise, it doesn't find anything at all which I fail to understand. I would understand if the regex matches whole string since .* is greedy but nothing at all? What am I doing wrong here?

To be clear - I know that regexes are not suitable for Parsing BUT I won't deal with more levels of bracket nesting and therefore I find usage of regexes good enough.

Upvotes: 1

Views: 141

Answers (2)

Jendas
Jendas

Reputation: 3579

Eventually it turned out to really be problem with gcc version so I finally got it working using boost::regex library and following code:

std::string str("{trol,asdfsad},{safsa,aaaaa,aaaaadfs}");
boost::regex rex("\\{(.*?)\\}", boost::regex_constants::perl);
boost::smatch result;

while (boost::regex_search(str, result, rex)) {
    for (uint i = 0; i < result.size(); ++i) {
        std::cout << result[i] << " ";
    }
    std::cout << std::endl;
    str = result.suffix().str();
}

Upvotes: 0

ForEveR
ForEveR

Reputation: 55897

If you want to use basic posix syntax, your regex should be

{\\(.*\\)}

If you want to use default ECMAScript, your regex should be

\\{(.*)\\}

with clang and libc++ or with gcc 4.9+ (since only it fully support regex) your code give:

Initiating search...
{trol,asdfsad},{safsa, aaaaa,aaaaadfs} trol,asdfsad},{safsa, aaaaa,aaaaadfs 

Live example on coliru

Upvotes: 1

Related Questions