6

文字列の部分文字列を削除したいのですが、次のようになります。

At(Robot,Room3)

また

SwitchOn(Room2)

また

SwitchOff(Room1)

インデックスがわからない場合、左角かっこ(から右角かっこまですべての文字を削除するにはどうすればよいですか?)

4

4 に答える 4

13

文字列がパターンに一致することがわかっている場合は、次のことができます。

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");
于 2012-12-14T13:41:14.187 に答える
2

コンパイラと標準ライブラリが十分に新しい場合は、std::regex_replace.

それ以外の場合は、最初の を'('検索し、最後の を逆検索して')'、 を使用std::string::eraseしてその間のすべてを削除します。または、閉じ括弧の後に何もない場合は、最初のものを見つけて、std::string::substr保持したい文字列を抽出するために使用します。

問題が実際に括弧を見つけることstd::string::findである場合は、 and/or を使用しstd::string::rfindます。

于 2012-12-14T13:39:11.947 に答える
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);

不正な入力に注意して、文字を2回以上解析しないでください。

于 2012-12-14T14:02:37.223 に答える
1

最初の '(' を検索し、'str.length() - 1' まで消去する必要があります (2 番目のブラケットが常に最後にあると仮定します)。

于 2012-12-14T13:42:20.863 に答える