2010-09-18 211 views
2

我不是太熟悉正則表達式,所以我一直有一些得到這與蘋果的NSRegularExpression如何使用NSRegularExpression刪除字符串中的括號?

我試圖刪除括號或括號中的詞......

例如工作:

的NSString *海峽= @「你怎麼使用(括號去掉的話)的字符串中

得到的字符串應該是:@

「使用你怎麼在字符串中」

謝謝!!!

回答

5

搜索

\([^()]*\) 

,並沒有更換。

作爲一個詳細的正則表達式:

\(  # match an opening parenthesis 
[^()]* # match any number of characters except parentheses 
\)  # match a closing parenthesis 

這將正常工作,如果括號是正確的平衡和嵌套的。如果括號可以嵌套(like this (for example)),那麼你需要重新運行替換直到沒有更多的匹配,因爲只有最裏面的括號將在每次運行相匹配。*

要卸下支架,做相同的\[[^[\]]*\],大括號\{[^{}]*\}

有了條件表達式,你可以一次完成所有的三個,但是正則表達式看起來很醜陋,不是嗎?

(?:(\()|(\[)|(\{))[^(){}[\]]*(?(1)\))(?(2)\])(?(3)\}) 

但是,我不確定是否NSRegularExpression可以處理條件。可能不會。這個怪物的說明:

(?:   # start of non-capturing group (needed for alternation) 
(\()   # Either match an opening paren and capture in backref #1 
|   # or 
(\[)   # match an opening bracket into backref #2 
|   # or 
(\{)   # match an opening brace into backref #3 
)    # end of non-capturing group 
[^(){}[\]]* # match any number of non-paren/bracket/brace characters 
(?(1)\))  # if capturing group #1 matched before, then match a closing parenthesis 
(?(2)\])  # if #2 matched, match a closing bracket 
(?(3)\})  # if #3 matched, match a closing brace. 

* 不能匹配任意嵌套的括號(因爲這些結構不再是常規的)正則表達式,所以這不是這個表達式尤其但一般正則表達式中的限制。

+0

感謝您的解釋哥們!這有助於很多! – Unikorn 2010-09-18 11:59:49

+0

對於這個例子:(像這樣(例如)) NSString * match = @「\\(。* \\)」;似乎工作。 – Unikorn 2010-09-18 12:10:18

+0

是的,但它會在保留(刪除)保留(刪除)保留時失敗 - 它從第一個到最後一個括號匹配,刪除中間的「保留」!您無法使用正則表達式匹配不規則的語言。有些風格(如Perl或.NET)可以進行遞歸匹配,但幾乎總是一個壞主意。這不是正則表達式。 – 2010-09-18 12:25:42

2

我不知道objectice-c正則表達式的味道,但在PCRE你可以這樣做:

s/\[.*?\]|\(.*?\)|\{.*?\}//g 

這將空字符串替換括號或括號之間的一切。

+0

這不起作用。它會匹配'(xxx('或'[yyy ['但不是'(xxx)'或'[yyy]'。 – 2010-09-18 10:52:28

+0

@Tim:你是對的,更新了答案。 – Toto 2010-09-18 11:05:05

+0

感謝您的回覆! – Unikorn 2010-09-18 11:09:41

相關問題