剥离换行符的方法

时间:2015-09-16 20:12:12

标签: c++ string text newline

假设我们有一个包含多个换行符的长字符串:

char const* some_text = "part1\n\npart2\npart3";

现在的任务是用空格替换所有'\ n'个字符,如果它只在文本部分之间出现一次,并且如果它出现多次则同时保留所有'\ n'个字符。换句话说:

"123\n456" => "123 456"
"123\n\n456" => "123\n\n456"
"123\n\n456\n789" => "123\n\n456 789"

这样做的最佳方式是什么?

3 个答案:

答案 0 :(得分:3)

以下正则表达式检测单次出现的换行符:

([^\n]|^)\n([^\n]|$)

|-------|
no newline before
(either other character or beginning of string)

        |--|
       newline

           |--------|
        no newline after
   (either other character or end of string)

您可以在std::regex_replace中使用该正则表达式,以便用空格替换这些单行换行符(并通过添加$1$2来保留换行符之前和之后的匹配字符:

std::string testString("\n123\n\n456\n789");
std::regex e("([^\n]|^)\n([^\n]|$)");
std::cout << std::regex_replace(testString, e, "$1 $2") << std::endl;

答案 1 :(得分:2)

此功能可能适用于您的情况,只需手动检查并将\n替换为space。可能有更好的选项,例如regex_replace

void rep(char ch[])
{
    int cnt = 0;
    int i;
    for(i=0; ch[i]!='\0'; i++)
    {
        if(ch[i]=='\n')
            cnt++;
        else if(cnt==1)
        {
            ch[i-1]=' ';
            cnt=0;
        }
        else
            cnt=0;
    }
    if(cnt==1)
        ch[i-1]=' ';
}

答案 2 :(得分:2)

由于它被标记为C ++,我将这样对待它。显然,这可以通过正则表达式来解决,但它同样微不足道(如上所述),而不是需要一个。

rep(0, length(x))