C ++ regex_match Ubuntu vs Win 10的Ubuntu

时间:2019-05-17 18:09:21

标签: c++ regex windows-10 ubuntu-18.04 windows-subsystem-for-linux

在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。

你们中有些人已经遇到过这个吗?如果是这样,您如何管理它?

1 个答案:

答案 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