Удалить символы из std :: string из & quot; (& quot; to & quot;) & quot; со стиранием?

Я хочу удалить подстроку моей строки, это выглядит примерно так:

At(Robot,Room3)

или же

SwitchOn(Room2)

или же

SwitchOff(Room1)

Как я могу удалить все символы из левой скобки ( к правой скобке ) когда я не знаю их индексы?

4

Решение

Если вы знаете, что строка соответствует шаблону, вы можете сделать:

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

Другие решения

Если ваш компилятор и стандартная библиотека достаточно новые, то вы можете использовать std::regex_replace.

В противном случае вы ищете первый '(', сделайте обратный поиск последнего ')'и использовать std::string::erase удалить все между ними. Или, если после закрывающей скобки ничего не может быть, найдите первую и используйте std::string::substr чтобы извлечь строку, которую вы хотите сохранить.

Если проблема у вас на самом деле обнаружение использование скобок std::string::find и / или std::string::rfind.

2

Вы должны искать первый ‘(‘, а затем стирать до тех пор, пока ‘str.length () — 1’ (при условии, что ваша вторая скобка всегда в конце)

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

Никогда не разбирайте персонажа более одного раза, остерегайтесь некорректных входных данных.

1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector