我有一个文件,我逐行读取,并使用正常工作的正则表达式进行解析。我要解析的是一些函数名称及其参数(这就是我捕获的内容)。在某些文件中,功能参数写为多行,如下所示:
result = f(a, b,
c,
d
);
如果将其写为result = f(a, b, c, d);
,则我的正则表达式可以正常工作。我应该如何处理多行?
答案 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);