逐行读取文件时匹配正则表达式多行

时间:2019-01-25 11:55:52

标签: c++ c++11 parsing

我有一个文件,我逐行读取,并使用正常工作的正则表达式进行解析。我要解析的是一些函数名称及其参数(这就是我捕获的内容)。在某些文件中,功能参数写为多行,如下所示:

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

如果将其写为result = f(a, b, c, d);,则我的正则表达式可以正常工作。我应该如何处理多行?

2 个答案:

答案 0 :(得分:0)

在等待一个最小的完整示例时,您可以执行以下操作:

  • 读一行
  • 如果行以;(或)(取决于您想要的内容)结尾)直接将行传递给正则表达式
  • 如果不继续阅读该行并将其附加在一起(当然没有换行符),直到找到;(
  • 将所有附加内容生成的字符串传递给正则表达式

答案 1 :(得分:0)

当前您正在阅读,直到'\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);