删除(嵌套)括号的正则表达式
Posted
技术标签:
【中文标题】删除(嵌套)括号的正则表达式【英文标题】:Regular Expression for Removing (nested) Parentheses 【发布时间】:2012-07-18 16:28:05 【问题描述】:我正在使用 DOM 将 Wikipedia 文章作为 NSString 获取,然后使用 NSString stringByReplacingOccurrencesOfString:withString:options:range: 删除不需要的东西。我正在使用正则表达式,我对此没有太多经验。通过阅读 Apple 的文档并尝试我能够做到这一点
"\\[[\\w]+\\]"
从***文章中删除括号的正则表达式。这工作得很好,因为括号没有嵌套。
现在我正在尝试从 NSString 中删除括号(包括其中的所有内容(和嵌套的))。我在嵌套部分遇到问题。有了这个
\\s+\\([^\\)]*+\\)
正则表达式我能够删除一组括号,包括它之前的空格(所以我不会在删除后得到重复的空格)。我可以使用什么正则表达式来做同样的事情,但也可以删除嵌套的括号?
我当前的实现将改变这一点
快速的棕色(略带红色)狐狸跳过了懒惰的(他老了(26 岁)并且筋疲力尽)。
进入这个
敏捷的棕色狐狸跳过了懒惰和疲惫的)狗。
而想要的结果是这样的
敏捷的棕色狐狸跳过了懒惰的狗。
【问题讨论】:
试试这个:删除 [^\)]* 并改写 .* 以使 * 运算符变得贪婪。如果这不起作用,则可能无法使用纯正则表达式来解决此问题。 "\\s+\(*+\)" 得到了原来的表达式,“快速的棕色(略带红色)狐狸跳过了懒惰的(他老了(26)并且筋疲力尽) 。” 不要试图“解析”***页面源。他们有一个excellent api 来获取渲染的内容。 正则表达式一般不适合“解析”嵌套语法。 我认为它的工作方式如下: 1. 找到左括号。 2. 继续直到下一个左括号。 3. 如果这两个左括号之间有右括号,则在索引最高的右括号处结束查找。如果没有找到右括号,请重复第 2 步和第 3 步。 【参考方案1】:我想通了。此方法将返回不带嵌套括号的字符串。
-(NSString*)stringWithoutParentheses:(NSString*)input
NSString *expression = @"\\s+\\([^()]*\\)";
while ([input rangeOfString:expression options:NSRegularExpressionSearch|NSCaseInsensitiveSearch].location!=NSNotFound)
input = [input stringByReplacingOccurrencesOfString:expression withString:@"" options:NSRegularExpressionSearch|NSCaseInsensitiveSearch range:NSMakeRange(0, [input length])];
return input;
用这个方法,通过
快速的棕色(略带红色)狐狸跳过了懒惰的(他老了(26)并且筋疲力尽)狗。
会回来
敏捷的棕色狐狸跳过了懒惰的狗。
【讨论】:
这个表达式的解释是它只去掉了内括号,但重复操作直到没有匹配的括号为止。以上是关于删除(嵌套)括号的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章