使用通配符匹配嵌套元素

时间:2014-02-25 18:43:39

标签: c# regex

我正在尝试使用正则表达式删除字符串的一部分。我想删除所有部分,如下所示:

[[File: bla bla bla]]

所以我使用了以下正则表达式(注意:[\ x5B]是'['和[\ x5D]是']'):

@"[\x5B][\x5B]File(.*?)[\x5D][\x5D]"
// Translates to @"[[File(.*?)]]"

但是文件标签中的文本可以包含更多标签,即

[[File: bla bla [[foo]] bla]]

上面的表达式会离开

bla]]

因为它检测到结束括号作为匹配的结尾(注意,我正在搜索非贪婪)。

因此,我提出了这个问题:

@"[\x5B][\x5B]File(.*?)[\x5B][\x5B](.*?)[\x5D][\x5D](.*?)[\x5D][\x5D]"
// Translates to @"[[File(.*?)[[(.*?)]](.*?)]]" 

删除包含一个内部标记的所有File标记。首先调用这个正则表达式然后上面更简单的正则表达式将删除所有内部标记为零的内容。

但是,File标签可以包含任意数量的内部标签,显然,我的方法不是很好。我刚刚开始使用正则表达式,非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

我认为这就是书中的情况 @"\[(?>(?:(?!\[|\]).)+|\[(?<Depth>)|\](?<-Depth>))*(?(Depth)(?!))\]"

 \[                            # Match opening [
 (?>                           # Then either match (possessively):
      (?:                           #  the following group which matches
           (?! \[ | \] )                 #  (but only if we're not at the start of [ or ] )
           .                             #  any character
      )+                            #  once or more
   |                              # or
      \[                            #  [ (and increase the braces counter)
      (?<Depth> )
   |                              # or
      \]                            #  ] (and decrease the braces counter).
      (?<-Depth> )
 )*                            # Repeat as needed.
 (?(Depth)                     # Assert that the braces counter is at zero.
      (?!)                          # Fail this part if depth > 0
 )
 \]                            # Then match a closing ].