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

Posted

技术标签:

【中文标题】使用擦除从“(”到“)”中删除 std::string 中的字符?【英文标题】:Remove characters from std::string from "(" to ")" with erase ? 【发布时间】:2012-12-14 13:36:12 【问题描述】:

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

At(Robot,Room3)

SwitchOn(Room2)

SwitchOff(Room1)

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

【问题讨论】:

可以有嵌套括号吗? @Shahbaz :不,只有一个 ( 和一个 ) 你熟悉string::find吗? 【参考方案1】:

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

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...

您也可以使用标准库&lt;regex&gt;

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

【讨论】:

1st 建议很棒! +1 并被选中。 有效,但如果你有,比如hugestring(tiny),效率会有点低,因为你要搜索相同的范围两次。 @KerrekSB 切换到find_last_of,尽管它仍然可能效率低下,例如tiny(tiny)hugestring. 是的,同样的问题。有效的方法是在第一个括号之后继续搜索。 @ypriverol 正则表达式不足以处理匹配的括号,正则表达式方法在这种情况下不起作用。另一种方法效果很好,因为它只是删除了第一个开始括号和最后一个结束括号之间的所有内容。【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

你必须搜索第一个 '(' 然后擦除直到 'str.length() - 1' (假设你的第二个括号总是在末尾)

【讨论】:

【参考方案4】:

简单安全高效解决方案:

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

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

【讨论】:

以上是关于使用擦除从“(”到“)”中删除 std::string 中的字符?的主要内容,如果未能解决你的问题,请参考以下文章

vector 去重

C++中erase函数的使用,可以用来删除内存擦除

以编程方式创建/删除/擦除磁盘分区?

如何在 C++ 中删除 char* [重复]

从内存存储中删除 Core Data 对象会将它们变成故障,但不会擦除它们

如何完全擦除/删除 catkin 工作区?