针对不同换行符的正则表达式

时间:2017-05-06 16:07:40

标签: c++ regex c++11

说我有一个文本,表示为std :: string,其中包含几个不同的换行符,例如\ r \ n但也只是\ n甚至只是\ r。

我现在想通过用\ r \ n替换所有非\ r \ n换行符来统一这一点,即所有\ r和所有\ n换行符。

一个简单的boost :: replace_all(text," \ n"," \ r \ n");并不会不幸地工作,因为这也会取代已经有效的\ r \ n中的\ n。

我认为std :: regex应该是处理这个问题的好方法......但我应该如何在正则表达式中表达这一点?这是一些代码:

#include <iostream>
#include <string>
#include <regex>

int main()
{
    std::string text = "a\rb\nc\r\nd\n";
    std::regex reg(""); // What to put here?
    text = std::regex_replace(text, reg, "\r\n");
    std::cout << text;
}

最后的文字应该是"aaa\r\nbbb\r\nccc\r\nddd\r\n"

4 个答案:

答案 0 :(得分:2)

交换&#34; \n&#34;没有前面的&#34; \r&#34;:

std::regex_replace(text, "([^\r])\n", "$1\r\n");

交换&#34; \r&#34;没有关注&#34; \n&#34;:

std::regex_replace(text, "\r([^\n])", "\r\n$1");

请注意,根据c ++ regexp风格,如果你正在考虑它,你很有可能不支持看看。

答案 1 :(得分:2)

你可以分两步完成:

  1. \n - &gt; \r\n
  2. \r\r\n - &gt; \r\n
  3. 或一步到位:

    (?:\r\n|\n|\r) - &gt; \r\n

    #include <iostream>
    #include <string>
    #include <regex>
    
    int main()
    {
        std::string text = "a\rb\nc\r\nd\n";
        text = std::regex_replace(text, std::regex("(?:\\r\\n|\\n|\\r)"), "\r\n");
        std::cout << text;
    }
    

答案 2 :(得分:1)

\n代表任何类型的换行符,即:\r\r\n或{{1}}

答案 3 :(得分:1)

std::regex_replace(text, reg, "\r\n|\r|\n");

应匹配。

更多信息:

Match linebreaks - \n or \r\n?