嵌套标签的C#正则表达式

时间:2011-01-21 00:43:57

标签: c# regex nested regex-negation

让我们从小例子开始;我有以下文字:

  

[[some tag [[with tag nested]] and again]]

我想匹配 [[与标签嵌套]] ,但不匹配 [[some tag [[with tag nested]] 。简单

\[\[(?<content>.+?)\]\]
显然没有用。所以我创建了regexp:

\[\[(?!.*?\[\[.*?\]\].*?)(?<content>.+?)\]\]

不幸的是,它与使用C#(使用MatchOptions.SingleLine)的任何内容都不匹配,而PHP的preg_match完美运行。

任何线索/想法?任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

这是一个有效的匹配吗?

[[ with [ single ] brackets ]]

如果没有,这个正则表达式应该这样做:

 \[\[(?<content>[^][]*)\]\]

[^][]匹配任何不是[]的字符。如果允许单个大括号 ,请尝试:

\[\[(?<content>(?:(?!\[\[|\]\]).)*)\]\]

(?!\[\[|\]\]).匹配任何字符,但只有在确定它不是[[]]序列的开头之后才会匹配。

答案 1 :(得分:3)

我知道找到最里面的括号之一的最简单方法是:

var match = Regex.Match(input, @"^.*(\[\[(.*?)\]\])", RegexOptions.Singleline);

这是有效的,因为它找到 last [[(因此后面不再有[[,因此它不能包含任何嵌套标签)然后立即关注]]。当然,这假设是良好的形式;如果你有一个字符串,其中开始/结束括号没有正确匹配,这可能会失败。

找到最里面的括号后,可以将其从输入字符串中删除:

input = input.Remove(match.Groups[1].Index, match.Groups[1].Length);

然后在while循环中重复该过程,直到正则表达式不再匹配。