c++ - Bug in VS13 regex: wrong order for alternatives? -
i need regex captures argument between parentheses. blanks before , after argument should not captured. example, "( ab & c )"
should return "ab & c"
. argument can enclosed single quotes if leading or trailing blanks needed. so, "( ' ab & c ' )"
should return " ab & c "
.
wstring string = l"( ' ab & c ' )"; wsmatch matches; regex_match( string, matches, wregex(l"\\(\\s*(?:'(.+)'|(.+?))\\s*\\)") ); wcout << l"<" + matches[1].str() + l"> " + l"<" + matches[2].str() + l">" + l"\n"; // results in "<> < ' ab & c '>", not ok
it seems second alternative matched, took space in front of first quote! should have been caught \s
after opening parenthesis.
removing second alternative:
regex_match( string, matches, wregex(l"\\(\\s*(?:'(.+)')\\s*\\)") ); wcout << l"<" + matches[1].str() + l">" + l"\n"; // results in "< ab & c >", ok
making capturing group of alternatives:
regex_match( string, matches, wregex(l"\\(\\s*('(.+)'|(.+?))\\s*\\)") ); wcout << l"<" + matches[1].str() + l"> " + l"<" + matches[2].str() + l"> " + l"<" + matches[3].str() + l">" + l"\n"; // results in "<' ab & c '> < ab & c > <> ", ok
am overlooking anything?
here suggestion merges 2 alternatives 1:
wstring string = l"( ' ab & c ' )"; wsmatch matches; regex_match( string, matches, wregex(l"\\(\\s*(')?([^']+)\\1\\s*\\)") ); wcout << l"<" + matches[2].str() + l"> " + l"\n";
the \(\s*(')?([^']+)\1\s*\)
regex using back-reference make sure have '
@ beginning , end in order not capture 'something
. value caught group 2.
output:
Comments
Post a Comment