VS13正则表达式中的错误:替代品的订单错误?

时间:2015-04-29 13:45:16

标签: c++ regex visual-studio-2013

我需要一个正则表达式来捕获括号之间的参数。不应该捕获论证之前和之后的空白。例如,"( ab & c )"应返回"ab & c"。如果需要前导或尾随空白,则可以将参数括在单引号中。因此,"( ' ab & c ' )"应该返回" 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

似乎第二种选择匹配,但它也占据了第一个引用前面的空间!它应该在左括号后被\s捕获。

删除第二种选择:

regex_match( String, Matches, wregex(L"\\(\\s*(?:'(.+)')\\s*\\)") );
wcout << L"<" + Matches[1].str() + L">" + L"\n";
// Results in "< ab & c >", OK

使其成为一组备选方案:

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

我能忽视什么吗?

1 个答案:

答案 0 :(得分:1)

我的建议是将两个选项合并为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";

\(\s*(')?([^']+)\1\s*\)正则表达式正在使用反向引用,以确保我们在开头和结尾都有',以便不捕获'something。该值将被捕获到第2组。

输出:

enter image description here