Совпадение регулярных выражений в несколько строк при чтении файла построчно - PullRequest
0 голосов
/ 25 января 2019

У меня есть файл, который я читаю построчно, и выполняю синтаксический анализ с регулярным выражением, которое прекрасно работает. Я анализирую имена некоторых функций и их параметры (это то, что я фиксирую). В некоторых файлах параметры функции записываются многострочно, например:

result = f(a, b,
c,
d
);

Если это было написано как result = f(a, b, c, d);, мое регулярное выражение работает нормально. Как мне разобраться с многолинейностью?

Ответы [ 2 ]

0 голосов
/ 25 января 2019

В данный момент вы читаете до '\n'. Но вы должны читать до ';':

#include <iostream>
#include <sstream>

int main() {
    std::stringstream file("result = f(a, b,\nc,\nd\n);\nresult = f2(a, b,\nc,\nd\n);");

    std::string function;
    while (std::getline(file, function, ';')) {
        std::cout << "function: " << (function[0] == '\n' ? "" : "\n") << function << std::endl;
    }
    return 0;
}

Дополнительно вы можете уменьшить каждую функцию до одной строки:

#include <iostream>
#include <sstream>

std::string trim(const std::string& s) {
    std::size_t b(0);
    while (s[b] == '\n') {
        ++b;
    }

    std::size_t e(s.length() - 1);
    while (s[e] == '\n') {
        --e;
    }
    return s.substr(b, e - b + 1);
}

std::string& join(std::string& s) {
    std::size_t pos(s.find('\n'));
    while (pos != s.npos) {
        s.replace(pos, 1, "");
        pos = s.find('\n', pos); // continue looking from current location
    }
    return s;
}

int main() {
    std::stringstream file("result = f(a, b,\nc,\nd\n);\nresult = f2(a, b,\nc,\nd\n);");

    std::string function;
    while (std::getline(file, function, ';')) {
        function += ';';
        std::cout << "function: " << trim(join(function)) << std::endl;
    }
    return 0;
}

trim удаляет разрыв строки до и после каждой функции. join удаляет каждый перевод строки внутри функции.

Введите:

result = f(a, b,
c,
d
);
result = f2(a, b,
c,
d
);

Выход:

function: result = f(a, b,c,d);
function: result = f2(a, b,c,d);
0 голосов
/ 25 января 2019

В ожидании минимального завершенного примера вы можете сделать следующее:

  • прочитать строку
  • , если строка заканчивается на ; (или ) в зависимости отна то, что вы хотите) передать строку в регулярное выражение непосредственно
  • , если не продолжаете читать строку и добавлять их вместе (конечно же, без символов новой строки), пока не будет найден ; или (;
  • передать строку, являющуюся результатом добавления в регулярное выражение
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...