2010-09-18 204 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

相关问题