删除(嵌套)括号的正则表达式

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)并且筋疲力尽)狗。

会回来

敏捷的棕色狐狸跳过了懒惰的狗。

【讨论】:

这个表达式的解释是它只去掉了内括号,但重复操作直到没有匹配的括号为止。

以上是关于删除(嵌套)括号的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

用于捕获嵌套括号中的值的正则表达式

使用正则表达式在嵌套括号外查找匹配项

由于未知错误,嵌套括号的动态正则表达式失败

用于匹配嵌套括号内的特定文本的 C# 正则表达式

嵌套捕获组如何在正则表达式中编号?

怎么通过正则表达删除含中文的括号部分但保留含英文的括号部分?