2017-05-06 4 views
1

私はstd :: stringで表されるテキストを持っています、これはいくつかの異なる改行を含んでいます。 \ r \ nだけでなく、\ nまたは\ rだけでも使用できます。異なる改行のための正規表現

ここで、すべての\ r \ n改行、つまりすべての\ rとすべての\ n改行を\ r \ nに置き換えて、これを統一したいと思います。

単純なboost :: replace_all(テキスト、 "\ n"、 "\ r \ n");それはすでに有効な\ 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; 
} 

テキストが末尾にちょうど「\n」を入れ替えるには改行のいずれかの種類の"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

する必要があります先行する「\r」:

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

注意をあなたがそれを検討している場合は、ルック尻をサポートすることはできませんC++の正規表現の風味の良い機会に依存:なし以下「\n」と「\r」を交換すること。

2

次の2つのステップでそれを行うことができます:

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

または1つのステップで:

(?:\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; 
} 
関連する問題