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] = ' ';