Advertisement
Guest User

Untitled

a guest
Dec 11th, 2014
166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.86 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <regex>
  4.  
  5. std::string foo(std::string input) {
  6.     // input намеренно принят не по const & т.к. мы будем в него писать
  7.     std::string output;
  8.     // R"(...)" - c++11'ный аналог шарповского @"..."
  9.     std::regex r(R"(\([^()]+\)|(([a-z]|\*)+))");
  10.     // к сожалению, регулярки в с++11 не умеют replace с коллбеком
  11.     // в boost::regex умеют, но, скорее всего, тебе не дадут его юзать
  12.     // если интересно - могу с ним набросать пример
  13.     std::smatch m;
  14.     // пока есть совпадения
  15.     while (std::regex_search(input, m, r)) {
  16.         // переписываем префикс (всё, что до совпадения) в ответ
  17.         output += m.prefix();
  18.         // добавляем пробелов по длине совпадения
  19.         output += std::string(m[0].length(), ' ');
  20.         // и продолжаем работать с суффиксом (всё, что после совпадения)
  21.         input = m.suffix();
  22.     }
  23.     // остаток тупо переписываем
  24.     output += input;
  25.     return output;
  26. }
  27.  
  28. void test(const std::string &in, const std::string &expected_out) {
  29.     std::string real_out = foo(in);
  30.     if (real_out == expected_out) {
  31.         std::cout << "PASS" << std::endl;
  32.     } else {
  33.         std::cout << "FAIL: got \"" << real_out << "\" instead of \"" <<
  34.             expected_out << "\"" << std::endl;
  35.     }
  36. }
  37.  
  38. int main() {
  39.     test("", "");
  40.     test("a", " ");
  41.     test("a*b*c", "     ");
  42.     test("a+b", " + ");
  43.     test("(a+b*c)+x*y", "       +   ");
  44.     test("(a+b*c)+x+y", "       + + ");
  45.     test("(a+b*c)+x+y+", "       + + +");
  46.     return 0;
  47. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement