Я хочу удалить подстроку моей строки, это выглядит примерно так:
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);
Никогда не разбирайте персонажа более одного раза, остерегайтесь некорректных входных данных.