修剪字符串c ++开头或结尾的匹配字符

时间:2017-09-28 23:03:52

标签: c++

在给定匹配字符的情况下,我需要修剪字符串的开头

我的功能定义如下:

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());

相反,上面的行修剪了除前两个字符之外的所有结束字符。

有什么想法吗? 感谢

2 个答案:

答案 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 = [&notok](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());
}

这很有效。现在我只需要了解原因。