在Win 10(WSL)上同时使用Ubuntu和Ubuntu时,我有一些奇怪的行为。这两个版本均为18.04和GCC,我正在使用以下标志进行编译:{{1}}。
我的问题是我有以下正则表达式:-std=c++11 -g
用于匹配一些类似于汇编程序的字符串(是的,我知道很长)。
我正在这样使用它:
^[\\t ]*(?:([.A-Za-z0-9_]+[:]))?(?:[\\t ]*([A-Za-z]{2,4})(?:[\\t ]+(@[A-Za-z0-9_]+(?:(?:\\+|-)[0-9]+)?|\".+?\"|\'.+?\'|[.A-Za-z0-9_]+)(?:[\\t ]*[,][\\t ]*(@[A-Za-z0-9_]+(?:(?:\\+|-)[0-9]+)?|\".+?\"|\'.+?\'|[.A-Za-z0-9_]+))?(?:[\\t ]*[,][\\t ]*(@[A-Za-z0-9_]+(?:(?:\\+|-)[0-9]+)?|\".+?\"|\'.+?\'|[.A-Za-z0-9_]+))?)?)?
这段代码在我的本机Ubuntu安装上运行良好,但是在Ubuntu std::ifstream infile(this->inFile.c_str());
while (std::getline(infile, line)) {
lineNumber++;
line = line.substr(0, line.find("#"));
if (line == "")
continue;
line = reduce(line);
if (regex_match(line, m, op_reg)) {
std::vector<std::string> ops;
ops.push_back(std::to_string(lineNumber));
for (int i = 1; i < m.size(); i++) {
if (m[i] != "") {
ops.push_back(m[i]);
}
}
this->maps.opMap.push_back(ops);
}
}
的WSL版本上始终返回false。
你们中有些人已经遇到过这个吗?如果是这样,您如何管理它?
答案 0 :(得分:0)
就像wp78de一样,弄乱正则表达式的原因是Windows样式行以\r\n
结尾,因为\r
将在字符串中
所以我做了一些小小的改动,因为我的字符串utils lib是:
void chomp(std::string& str) {
const auto pos = str.find_last_not_of("\r\n");
str.erase(pos + 1);
}
在用正则表达式测试字符串之前,这个小家伙删除了我字符串中剩余的\r