我需要一个正则表达式来捕获括号之间的参数。不应该捕获论证之前和之后的空白。例如,"( 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
我能忽视什么吗?
答案 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组。
输出: