Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- #include <regex>
- std::string foo(std::string input) {
- // input намеренно принят не по const & т.к. мы будем в него писать
- std::string output;
- // R"(...)" - c++11'ный аналог шарповского @"..."
- std::regex r(R"(\([^()]+\)|(([a-z]|\*)+))");
- // к сожалению, регулярки в с++11 не умеют replace с коллбеком
- // в boost::regex умеют, но, скорее всего, тебе не дадут его юзать
- // если интересно - могу с ним набросать пример
- std::smatch m;
- // пока есть совпадения
- while (std::regex_search(input, m, r)) {
- // переписываем префикс (всё, что до совпадения) в ответ
- output += m.prefix();
- // добавляем пробелов по длине совпадения
- output += std::string(m[0].length(), ' ');
- // и продолжаем работать с суффиксом (всё, что после совпадения)
- input = m.suffix();
- }
- // остаток тупо переписываем
- output += input;
- return output;
- }
- void test(const std::string &in, const std::string &expected_out) {
- std::string real_out = foo(in);
- if (real_out == expected_out) {
- std::cout << "PASS" << std::endl;
- } else {
- std::cout << "FAIL: got \"" << real_out << "\" instead of \"" <<
- expected_out << "\"" << std::endl;
- }
- }
- int main() {
- test("", "");
- test("a", " ");
- test("a*b*c", " ");
- test("a+b", " + ");
- test("(a+b*c)+x*y", " + ");
- test("(a+b*c)+x+y", " + + ");
- test("(a+b*c)+x+y+", " + + +");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement