C++ regex_iterator示例
示例
当必须反复进行捕获处理时,aregex_iterator是一个不错的选择。取消引用aregex_iterator将返回match_result。这对于条件捕获或具有相互依赖性的捕获非常有用。假设我们要标记一些C++代码。鉴于:
enum TOKENS { NUMBER, ADDITION, SUBTRACTION, MULTIPLICATION, DIVISION, EQUALITY, OPEN_PARENTHESIS, CLOSE_PARENTHESIS };
我们可以令牌化这个字符串:constautoinput="42/2+-8\t=\n(2+2)*2*2-3"s有regex_iterator这样的:
vector<TOKENS> tokens; const regex re{ "\\s*(\\(?)\\s*(-?\\s*\\d+)\\s*(\\)?)\\s*(?:(\\+)|(-)|(\\*)|(/)|(=))" }; for_each(sregex_iterator(cbegin(input), cend(input), re), sregex_iterator(), [&](const auto& i) { if(i[1].length() > 0) { tokens.push_back(OPEN_PARENTHESIS); } tokens.push_back(i[2].str().front() == '-' ? NEGATIVE_NUMBER : NON_NEGATIVE_NUMBER); if(i[3].length() > 0) { tokens.push_back(CLOSE_PARENTHESIS); } auto it = next(cbegin(i), 4); for(int result = ADDITION; it != cend(i); ++result, ++it) { if (it->length() > 0U) { tokens.push_back(static_cast<TOKENS>(result)); break; } } }); match_results<string::const_reverse_iterator> sm; if(regex_search(crbegin(input), crend(input), sm, regex{ tokens.back() == SUBTRACTION ? "^\\s*\\d+\\s*-\\s*(-?)" : "^\\s*\\d+\\s*(-?)" })) { tokens.push_back(sm[1].length() == 0 ? NON_NEGATIVE_NUMBER : NEGATIVE_NUMBER); }
现场例子
使用正则表达式迭代器的一个值得注意的陷阱是该regex参数必须为L值,而R值将不起作用:VisualStudioregex_iterator错误?