#include <iostream>
#include <regex.h>
#include <string.h>
using namespace std;
int main( ) {
char * haystack = "MyCarGarage@Mustang((property(PS)val(500))@Porsche((property(PS)val(425))@Corvette@Corsair@Pinto((property(exploded)val(not yet))" ;
regex_t needle;
regcomp( & needle, "@([^(@]+)(\\ (\\ (property\\ (([^)]+)\\ )val\\ (([^)]+)\\ ))?" , REG_ICASE| REG_EXTENDED) ;
regmatch_t match[ 5 ] ;
int ret;
int x = 1 ;
while ( ! ( ret = regexec( & needle, haystack, 5 , match,0 ) ) ) {
cerr << "MATCH INSTANCE " << x++ << "\n " ;
for ( int i= 0 ; i< 5 ; i++ ) {
if ( i== 2 ) continue ;
cerr << " match[" << i<< "]: " << match[ i] .rm_so << " to " << match[ i] .rm_eo << "\n " ;
int l = strlen ( haystack) ;
if ( ! ( match[ i] .rm_so > l || match[ i] .rm_so < 0 || match[ i] .rm_eo > l || match[ i] .rm_so < 0 ) ) {
for ( int j= match[ i] .rm_so ; j< match[ i] .rm_eo ; j++ ) {
cerr << haystack[ j] ;
if ( i) cout << haystack[ j] ;
}
}
if ( i && i ! = 4 ) cout << "," ;
cerr << "\n " ;
}
cout << "\n " ;
haystack = & haystack[ match[ 0 ] .rm_eo ] ;
}
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8cmVnZXguaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmludCBtYWluKCkgewogICAgY2hhciogaGF5c3RhY2sgPSAiTXlDYXJHYXJhZ2VATXVzdGFuZygocHJvcGVydHkoUFMpdmFsKDUwMCkpQFBvcnNjaGUoKHByb3BlcnR5KFBTKXZhbCg0MjUpKUBDb3J2ZXR0ZUBDb3JzYWlyQFBpbnRvKChwcm9wZXJ0eShleHBsb2RlZCl2YWwobm90IHlldCkpIjsKICAgIHJlZ2V4X3QgbmVlZGxlOwogICAgcmVnY29tcCgmbmVlZGxlLCAiQChbXihAXSspKFxcKFxcKHByb3BlcnR5XFwoKFteKV0rKVxcKXZhbFxcKChbXildKylcXCkpPyIsIFJFR19JQ0FTRXxSRUdfRVhURU5ERUQpOwogICAgcmVnbWF0Y2hfdCBtYXRjaFs1XTsKICAgIGludCByZXQ7CiAgICBpbnQgeCA9IDE7CiAgICB3aGlsZSAoIShyZXQgPSByZWdleGVjKCZuZWVkbGUsIGhheXN0YWNrLCA1LCBtYXRjaCwwKSkpewogICAgICAgIGNlcnIgPDwgIk1BVENIIElOU1RBTkNFICIgPDwgeCsrIDw8ICJcbiI7CiAgICAgICAgZm9yIChpbnQgaT0wOyBpPDU7IGkrKyl7CiAgICAgICAgICAgIGlmIChpPT0yKSBjb250aW51ZTsKICAgICAgICAgICAgY2VyciA8PCAiICBtYXRjaFsiPDxpPDwiXTogIjw8IG1hdGNoW2ldLnJtX3NvIDw8ICIgdG8gIiA8PCBtYXRjaFtpXS5ybV9lbyA8PCAiXG4gICAgIjsKICAgICAgICAgICAgaW50IGwgPSBzdHJsZW4oaGF5c3RhY2spOwogICAgICAgICAgICBpZiAoIShtYXRjaFtpXS5ybV9zbyA+IGwgfHwgbWF0Y2hbaV0ucm1fc288MCB8fCBtYXRjaFtpXS5ybV9lbyA+IGwgfHwgbWF0Y2hbaV0ucm1fc288IDApKXsKICAgICAgICAgICAgICAgIGZvciAoaW50IGo9IG1hdGNoW2ldLnJtX3NvOyBqPG1hdGNoW2ldLnJtX2VvOyBqKyspewogICAgICAgICAgICAgICAgICAgIGNlcnIgPDwgaGF5c3RhY2tbal07CiAgICAgICAgICAgICAgICAgICAgaWYoaSkgY291dCA8PCBoYXlzdGFja1tqXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZihpICYmIGkgIT0gNCkgY291dDw8IiwiOwogICAgICAgICAgICBjZXJyIDw8IlxuIjsKICAgICAgICB9CiAgICAgICAgY291dCA8PCJcbiI7CiAgICAgICAgaGF5c3RhY2sgPSAmaGF5c3RhY2tbbWF0Y2hbMF0ucm1fZW9dOwogICAgfQogICAgcmV0dXJuIDA7Cn0=
stdout
Mustang,PS,500
Porsche,PS,425
Corvette,,
Corsair,,
Pinto,exploded,not yet
stderr
MATCH INSTANCE 1
match[0]: 11 to 41
@Mustang((property(PS)val(500)
match[1]: 12 to 19
Mustang
match[3]: 30 to 32
PS
match[4]: 37 to 40
500
MATCH INSTANCE 2
match[0]: 1 to 31
@Porsche((property(PS)val(425)
match[1]: 2 to 9
Porsche
match[3]: 20 to 22
PS
match[4]: 27 to 30
425
MATCH INSTANCE 3
match[0]: 1 to 10
@Corvette
match[1]: 2 to 10
Corvette
match[3]: -1 to -1
match[4]: -1 to -1
MATCH INSTANCE 4
match[0]: 0 to 8
@Corsair
match[1]: 1 to 8
Corsair
match[3]: -1 to -1
match[4]: -1 to -1
MATCH INSTANCE 5
match[0]: 0 to 38
@Pinto((property(exploded)val(not yet)
match[1]: 1 to 6
Pinto
match[3]: 17 to 25
exploded
match[4]: 30 to 37
not yet