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

Jan*_*oux 6 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
Run Code Online (Sandbox Code Playgroud)

似乎第二种选择匹配,但它也占据了第一个引用前面的空间!应该\s在开括号之后抓住它.

删除第二个替代方案:

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

使其成为一组备选方案:

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
Run Code Online (Sandbox Code Playgroud)

我忽略了什么吗?

Wik*_*żew 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";
Run Code Online (Sandbox Code Playgroud)

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

输出:

在此输入图像描述