2012-12-14 88 views
2

我想刪除我的字符串的子串,它看起來是這樣的:使用擦除從「(」到「)」從std :: string中刪除字符?

At(Robot,Room3) 

SwitchOn(Room2) 

SwitchOff(Room1) 

我怎樣才能從刪除的所有字符左支架(右支架),當我不知道他們的索引?

+0

莫不是嵌套括號 – Shahbaz

+0

@Shahbaz:不,只有一個'('和一個'')'。 – ron

+1

你是否熟悉[string :: find](http://en.cppreference.com/w/cpp/string/basic_string/find)? – Shahbaz

回答

6

如果你知道字符串匹配的模式,那麼你可以這樣做:

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"); 
+0

'1st'的建議太棒了! +1和選擇。 – ron

+1

有用,但如果你有'hugestring(tiny)',那麼效率會有點低,因爲你搜索的範圍是兩次。 –

+0

@KerrekSB切換到'find_last_of',儘管它仍然效率低下,例如'微小(微小)hugestring'。 – bames53

2

如果你的編譯器和標準庫足夠新,那麼你可以使用std::regex_replace

否則,您將搜索第一個'(',對最後一個')'執行反向搜索,並使用std::string::erase刪除之間的所有內容。或者如果在右括號後面沒有任何內容,請找到第一個,然後使用std::string::substr來提取要保留的字符串。

如果您遇到的問題實際上是找到括號使用std::string::find和/或std::string::rfind

1

你要搜索的第一個「(」然後刪除後,直到「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); 

決不解析字符不止一次,謹防形成不良的輸入