从字符串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());

相反,上方的线修剪所有结尾字符,除了前两个。

有什么想法吗?谢谢

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

好吧,实际上我只是弄清楚了。对于反向情况,我似乎需要逆转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());
}

这有效。现在我只需要了解为什么。

最新更新