在给定匹配字符的情况下,我需要修剪字符串的开头或。
我的功能定义如下:
void trim(std::string &s, char c, bool reverse = false);
bool reverse
标记是否修剪字符串的开头(false)或结束(true)。
例如:
s = "--myarg--";
trim(s, '-', false); // should set s to "myarg--"
trim(s, '-', true); // should set s to "--myarg"
要修剪开头(即reverse=false
),这样可以正常工作:
bool ok = true;
auto mayberemove = [&ok](std::string::value_type ch){if (ch != '-') ok = false; return ok;};
s.erase(std::remove_if(s.begin(), s.end(), mayberemove), s.end());
对于匹配' - '的每个字符,lambda只返回true
,直到第一次出现不匹配的字符,然后继续返回false。在这里,我将匹配的字母硬编码为' - ',以使代码更易于阅读。
我遇到的麻烦是反向修剪。这不起作用 - 与上面相同,但使用反向迭代器和:: base():
s.erase(std::remove_if(s.rbegin(), s.rend(), mayberemove).base(), s.end());
相反,上面的行修剪了除前两个字符之外的所有结束字符。
有什么想法吗? 感谢
答案 0 :(得分:3)
std::string& trim( std::string& s, char c, bool reverse = false )
{
return reverse
? s.erase( s.find_last_not_of( c ) + 1 )
: s.erase( 0, s.find_first_not_of( c ) );
}
答案 1 :(得分:0)
嗯,实际上我只是想通了。看起来我需要在相反的情况下反转mayberemove
lambda的逻辑。所以,这似乎工作正常:
if (reverse) {
bool notok = false;
auto mayberemove = [¬ok](std::string::value_type ch){if (ch != '-') notok = true; return notok;};
s.erase(std::remove_if(s.rbegin(), s.rend(), mayberemove).base(), s.end());
}
else {
bool ok = true;
auto mayberemove = [&ok](std::string::value_type ch){if (ch != '-') ok = false; return ok;};
s.erase(std::remove_if(s.begin(), s.end(), mayberemove),s.end());
}
这很有效。现在我只需要了解原因。