我使用这个函数来分割字符串:
std::vector<std::string> splitString(const std::string& stringToSplit, const std::string& regexPattern)
{
std::vector<std::string> result;
const std::regex rgx(regexPattern);
std::sregex_token_iterator iter(stringToSplit.begin(), stringToSplit.end(), rgx, -1);
for (std::sregex_token_iterator end; iter != end; ++iter)
{
result.push_back(iter->str());
}
return result;
}
现在,如果我想逐行分割字符串(例如,我已将文件内容读取到单个变量中),我会这样做:
auto vec = splitString(fileContent, "\\n");
在 Windows 上,我得到这个:
line 1 \r
line 2 \r
发生这种情况是因为 Windows 行结尾是由 \r\n
确定的。我尝试过使用 $
,但再次没有成功。在 Windows 中捕获行结尾的正确方法是什么?
最佳答案
在 Linux/Unix、OS X、iOS、Android 操作系统上,行分隔符是 \r
或 \n
或它们的组合。因此,捕获它们的最有效方法是将其放入字符类中并使用 +
量词。
因此,[\\r\\n]+
应该“达到目的”:
auto vec = splitString(fileContent, "[\\r\\n]+");
编辑:
正如 @FabioFracassi 提到的,这将删除空行。 如果应在输出中保留空行,您可以使用
auto vec = splitString(fileContent, "(?:\\r\\n|\\r|\\n)");
替代列表从最长的选项开始,因为正则表达式是从左到右处理的(至少默认情况下是这样)。
关于C++ 使用 std::regex 逐行分割字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30050739/