删除std :: string中的字符从“(”到“)”删除?

时间:2012-12-14 13:36:12

标签: c++ string std erase

我想删除字符串的子字符串,它看起来像这样:

At(Robot,Room3)

SwitchOn(Room2)

SwitchOff(Room1)

当我不知道他们的索引时,如何将左括号(中的所有字符移除到右括号)

4 个答案:

答案 0 :(得分:9)

如果你知道字符串与模式匹配,那么你可以这样做:

std::string str = "At(Robot,Room3)";
str.erase( str.begin() + str.find_first_of("("),
           str.begin() + str.find_last_of(")"));

或者如果你想更安全

auto begin = str.find_first_of("(");
auto end = str.find_last_of(")");
if (std::string::npos!=begin && std::string::npos!=end && begin <= end)
    str.erase(begin, end-begin);
else
    report error...

您还可以使用标准库<regex>

std::string str = "At(Robot,Room3)";
str = std::regex_replace(str, std::regex("([^(]*)\\([^)]*\\)(.*)"), "$1$2");

答案 1 :(得分:2)

如果您的编译器和标准库足够新,那么您可以使用std::regex_replace

否则,您搜索第一个'(',对最后一个')'进行反向搜索,然后使用std::string::erase删除其中的所有内容。或者,如果在右括号后面没有任何内容,则找到第一个并使用std::string::substr来提取要保留的字符串。

如果您遇到的麻烦实际上是找到括号,请使用std::string::find和/或std::string::rfind

答案 2 :(得分:1)

你必须搜索第一个&#39;(&#39;然后擦除直到&#39; str.length() - 1&#39;(假设你的第二个括号总是在最后)

答案 3 :(得分:1)

一个简单的且安全有效的解决方案:

std::string str = "At(Robot,Room3)";

size_t const open = str.find('(');
assert(open != std::string::npos && "Could not find opening parenthesis");

size_t const close = std.find(')', open);
assert(open != std::string::npos && "Could not find closing parenthesis");

str.erase(str.begin() + open, str.begin() + close);

永远不要解析一个角色,注意形成不良的输入。