我想刪除我的字符串的子串,它看起來是這樣的:使用擦除從「(」到「)」從std :: string中刪除字符?
At(Robot,Room3)
或
SwitchOn(Room2)
或
SwitchOff(Room1)
我怎樣才能從刪除的所有字符左支架(
右支架)
,當我不知道他們的索引?
我想刪除我的字符串的子串,它看起來是這樣的:使用擦除從「(」到「)」從std :: string中刪除字符?
At(Robot,Room3)
或
SwitchOn(Room2)
或
SwitchOff(Room1)
我怎樣才能從刪除的所有字符左支架(
右支架)
,當我不知道他們的索引?
如果你知道字符串匹配的模式,那麼你可以這樣做:
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");
如果你的編譯器和標準庫足夠新,那麼你可以使用std::regex_replace
。
否則,您將搜索第一個'('
,對最後一個')'
執行反向搜索,並使用std::string::erase
刪除之間的所有內容。或者如果在右括號後面沒有任何內容,請找到第一個,然後使用std::string::substr
來提取要保留的字符串。
如果您遇到的問題實際上是找到括號使用std::string::find
和/或std::string::rfind
。
你要搜索的第一個「(」然後刪除後,直到「str.length() - 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);
決不解析字符不止一次,謹防形成不良的輸入
莫不是嵌套括號 – Shahbaz
@Shahbaz:不,只有一個'('和一個'')'。 – ron
你是否熟悉[string :: find](http://en.cppreference.com/w/cpp/string/basic_string/find)? – Shahbaz