文字列の部分文字列を削除したいのですが、次のようになります。
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
である場合は、 and/or を使用しstd::string::rfind
ます。
シンプルで安全かつ効率的なソリューション:
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);
不正な入力に注意して、文字を2回以上解析しないでください。
最初の '(' を検索し、'str.length() - 1' まで消去する必要があります (2 番目のブラケットが常に最後にあると仮定します)。