C++ 使用 std::regex 逐行分割字符串

标签 c++ regex

我使用这个函数来分割字符串:

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/

相关文章:

c++算法将整数转换为bool数组

Javascript 变量 - 初始化/数学/存储数值

php - 在文件夹中使用 .htaccess 隐藏查询字符串

javascript - 删除标点符号,保留空格,toLowerCase,简洁地添加破折号

javascript - 为什么这个简单的 JavaScript 不起作用?

java - 用整数替换所有变量

c++ - 是什么导致这种在 try block 展开期间抛出析构函数的奇怪行为?

c++ - 尝试在C++中打印树的内容时出现内存分配错误

c++ - Switch 或 else if 语句——C++ 中更清楚的是什么

c++ - 模板参数推导与 QT lambda 不匹配