6

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

At(Robot,Room3)

或者

SwitchOn(Room2)

或者

SwitchOff(Room1)

当我不知道它们的索引时,如何删除从左括号(到右括号的所有字符?)

4

4 回答 4

13

如果您知道字符串与模式匹配,那么您可以执行以下操作:

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");
于 2012-12-14T13:41:14.187 回答
2

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

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

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

于 2012-12-14T13:39:11.947 回答
1

您必须搜索第一个 '(' 然后擦除直到 'str.length() - 1' (假设您的第二个括号始终位于末尾)

于 2012-12-14T13:42:20.863 回答
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);

永远不要多次解析一个字符,注意格式错误的输入。

于 2012-12-14T14:02:37.223 回答