我想删除字符串的子字符串,它看起来像这样:
At(Robot,Room3)
或
SwitchOn(Room2)
或
SwitchOff(Room1)
当我不知道他们的索引时,如何将左括号(
中的所有字符移除到右括号)
?
答案 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);
永远不要解析一个角色,注意形成不良的输入。