C++ 换行符的剥离方法

C++ 换行符的剥离方法,c++,string,text,newline,C++,String,Text,Newline,假设我们有一个包含多个换行符的长字符串: char const* some_text = "part1\n\npart2\npart3"; 现在的任务是,如果所有'\n'字符在文本部分之间只出现一次,则将其替换为空格;如果所有'\n'字符出现多次,则同时保留所有'\n'字符。换言之: "123\n456" => "123 456" "123\n\n456" => "123\n\n456" "123\n\n456\n789" => "123\n\n456 789" 执行此操作

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

char const* some_text = "part1\n\npart2\npart3";
现在的任务是,如果所有'\n'字符在文本部分之间只出现一次,则将其替换为空格;如果所有'\n'字符出现多次,则同时保留所有'\n'字符。换言之:

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

执行此操作的最佳方法是什么?

此功能可能适用于您的情况,只需手动检查并将单个
\n
替换为
空格
。也许有更好的选择,比如


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

([^\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::CUT< P>因为它被标记为C++,我会这样对待它。显然,这可以用正则表达式解决,但不需要正则表达式(如上所述)也同样微不足道


循环浏览并检查换行符,如果下一个不是换行符,则进行更改?
std::regex_replace
@ventsyv:如果你阅读了这个问题,你会发现这个问题并不要求全部替换occurrences@AlekDepler使用
regex
有什么问题?性能?警告:不要尝试对此C字符串进行任何修改:
char*some\u text=“part1\n\npart2\npart3”-它是只读的;在许多平台上,向它写入内容将因访问冲突而死亡!不错。我认为这是最简单的方法。我喜欢用这种ASCII艺术来解释正则表达式。
([^\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::string testString("\n123\n\n456\n789");
std::regex e("([^\n]|^)\n([^\n]|$)");
std::cout << std::regex_replace(testString, e, "$1 $2") << std::endl;
std::string s = "your\n\nstring\nhere\n";
size_t n = -1, len = s.length();
    while ((n = s.find('\n', n+1)) != std::string::npos)
        if ((n == 0 && s[n+1] != '\n') || (n == len && s[n-1] != '\n') ||
            (n != 0 && n != len && s[n-1] != '\n' && s[n+1] != '\n'))
            s[n] = ' ';