2017-05-06 14 views
1

說我有一個文本,表示爲std :: string,其中包含幾個不同的換行符,例如, \ r \ n,但也只是\ n甚至只是\ r。不同的換行符的正則表達式

我現在想通過用\ r \ n替換所有非\ r \ n換行符,即所有\ r和所有\ n換行符來統一它。

一個簡單的boost :: replace_all(text,「\ n」,「\ r \ n」);不會不幸地工作,因爲這也會取代\ 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"

回答

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

應該匹配。

此處瞭解詳情:

Match linebreaks - \n or \r\n?

+1

這似乎工作,謝謝! – SampleTime

+1

更好的模式是'\ r \ n?| \ n'。備選方案應該在不同地點進行匹配,作爲最佳做法。 –

+0

@WiktorStribiżew:用什麼指標「更好」? 「替代品應該在不同地點匹配」是什麼意思? –

1

\R代表任何種類的換行符,即:\n\r\r\n

+0

似乎不是工作,我使用std ::正則表達式REG( 「\\ R」);但沒有在原始字符串中被替換... – SampleTime

2

要交換「\n」沒有前面的「\r」:

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

要交換「\r」,沒有下面的「\n」:視C++的正則表達式的味道很好的機會,你不能看支持的屁股,如果你認爲它

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

注意。

2

你可以做,在兩個步驟:

  1. \n - >\r\n
  2. \r\r\n - >\r\n

或一步到位:

(?:\r\n|\n|\r) - >\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; 
}