删除字符直到下一个 '\n'
Delete characters until next '\n'
我正在尝试从所有评论中清除我的字符串。
代码中的注释用“;”表示在句子前面。
有时程序的结尾用“;;”
表示
所以假设我们有
push 34 ; example
push 45
add
为了检测出现“;”我这样做 :
std::size_t findComment = _string.find(";");
我希望能够做到这一点:
_string = _string.erase(findComment, '\n');
删除位置和第一个'\n'之间的所有内容。
提前致谢:)
更新:
我拿的是康拉德的版本。它运作良好。但是如果用户在标准输出上写这个:
push int32(50)
push int32(50)
add
dump
;;
它应该执行该函数并显示 100(转储显示堆栈)。但是因为它以“;;”结尾函数 trim_comments 删除函数转储。所以它没有被执行..
erase
方法执行作业。 All you Need 它是 \n
位置的第二个迭代器。
// This code assumes that _string holds one line of the text.
std::size_t findComment = _string.find(";;");
std::size_t findNewLine = _string.find("\n");
_string = _string.erase(findComment, findNewLine);
如果必须处理不止一行,请使用 Konrads 答案。
如果不想擦除换行符可以在擦除前使用--findNewLine
。
find
has an overload 可让您指定开始搜索位置:
typedef std::string::size_type size_type;
size_type const comment_start = _string.find(";;");
size_type const newline = _string.find("\n", comment_start + 2);
if (newline == std::string::npos)
_string.erase(comment_start);
else
_string.erase(comment_start, newline - comment_start);
此外,请注意上面代码中 typedef
的使用,您的代码对 find
返回的位置使用了错误的类型。
但是,此代码仅删除一条评论。通过迭代 erase
ing 从字符串中删除多个注释是非常低效的。相反,您要做的是从非注释片段构建一个全新的字符串。要在 C++ 中高效地构建字符串,您可以使用 std::[o]stringstream
class 而不是裸 std::string
.
这是一个应该运行良好的示例实现:
std::string trim_comments(std::string const& code) {
typedef std::string::size_type size_t;
std::string const comment_start = ";;";
std::ostringstream result;
// Iteratively search for the start of the next comment and copy code before
// that into the result.
// We start by setting the previous comment end (the newline position) to
// the start of the code.
size_t newline_pos = 0;
while (newline_pos != std::string::npos) {
size_t const comment_pos = code.find(comment_start, newline_pos);
if (comment_pos == std::string::npos) {
// No more comments; copy the rest of the code from here until the
// end into the result and quit.
result << code.substr(newline_pos);
break;
}
result << code.substr(newline_pos, comment_pos - newline_pos);
// Find end of comment, assuming UNIX line endings.
newline_pos = code.find('\n', comment_pos + comment_start.length());
}
return result.str();
}
您会注意到它比之前的短代码要复杂得多。这是我们为正确性付出的代价。更简单的解决方案需要更高级的文本处理功能,例如正则表达式(C++11 原生支持,可以通过库添加到 C++98)。
std::size_t commentPos = s.find(";;");
if (commentPos != std::string::npos) {
std::size_t nlPos = s.find_first_of("\r\n", commentPos);
if (nlPos != std::string::npos) {
s.erase(commentPos, nlPos - commentPos);
} else {
s.erase(commentPos);
}
}
我正在尝试从所有评论中清除我的字符串。 代码中的注释用“;”表示在句子前面。 有时程序的结尾用“;;”
表示所以假设我们有
push 34 ; example
push 45
add
为了检测出现“;”我这样做 :
std::size_t findComment = _string.find(";");
我希望能够做到这一点:
_string = _string.erase(findComment, '\n');
删除位置和第一个'\n'之间的所有内容。
提前致谢:)
更新:
我拿的是康拉德的版本。它运作良好。但是如果用户在标准输出上写这个:
push int32(50)
push int32(50)
add
dump
;;
它应该执行该函数并显示 100(转储显示堆栈)。但是因为它以“;;”结尾函数 trim_comments 删除函数转储。所以它没有被执行..
erase
方法执行作业。 All you Need 它是 \n
位置的第二个迭代器。
// This code assumes that _string holds one line of the text.
std::size_t findComment = _string.find(";;");
std::size_t findNewLine = _string.find("\n");
_string = _string.erase(findComment, findNewLine);
如果必须处理不止一行,请使用 Konrads 答案。
如果不想擦除换行符可以在擦除前使用--findNewLine
。
find
has an overload 可让您指定开始搜索位置:
typedef std::string::size_type size_type;
size_type const comment_start = _string.find(";;");
size_type const newline = _string.find("\n", comment_start + 2);
if (newline == std::string::npos)
_string.erase(comment_start);
else
_string.erase(comment_start, newline - comment_start);
此外,请注意上面代码中 typedef
的使用,您的代码对 find
返回的位置使用了错误的类型。
但是,此代码仅删除一条评论。通过迭代 erase
ing 从字符串中删除多个注释是非常低效的。相反,您要做的是从非注释片段构建一个全新的字符串。要在 C++ 中高效地构建字符串,您可以使用 std::[o]stringstream
class 而不是裸 std::string
.
这是一个应该运行良好的示例实现:
std::string trim_comments(std::string const& code) {
typedef std::string::size_type size_t;
std::string const comment_start = ";;";
std::ostringstream result;
// Iteratively search for the start of the next comment and copy code before
// that into the result.
// We start by setting the previous comment end (the newline position) to
// the start of the code.
size_t newline_pos = 0;
while (newline_pos != std::string::npos) {
size_t const comment_pos = code.find(comment_start, newline_pos);
if (comment_pos == std::string::npos) {
// No more comments; copy the rest of the code from here until the
// end into the result and quit.
result << code.substr(newline_pos);
break;
}
result << code.substr(newline_pos, comment_pos - newline_pos);
// Find end of comment, assuming UNIX line endings.
newline_pos = code.find('\n', comment_pos + comment_start.length());
}
return result.str();
}
您会注意到它比之前的短代码要复杂得多。这是我们为正确性付出的代价。更简单的解决方案需要更高级的文本处理功能,例如正则表达式(C++11 原生支持,可以通过库添加到 C++98)。
std::size_t commentPos = s.find(";;");
if (commentPos != std::string::npos) {
std::size_t nlPos = s.find_first_of("\r\n", commentPos);
if (nlPos != std::string::npos) {
s.erase(commentPos, nlPos - commentPos);
} else {
s.erase(commentPos);
}
}