2

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

[[ 一些标签 [[ 带有嵌套标签 ]] 和再次 ]]

我想匹配[[ with tag nested ]]但不是[[ some tag [[ with tag nested ]]。简单的

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

显然没有用。所以我创建了正则表达式:

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

不幸的是,它不匹配任何使用 C#(使用 MatchOptions.SingleLine)的东西,而 PHP 的 preg_match 工作得很好。

任何线索/想法?任何帮助将非常感激。

4

2 回答 2

3

这会是一个有效的匹配吗?

[[ with [ single ] brackets ]]

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

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

[^][]匹配任何不是[or的字符]如果允许单括号,试试这个:

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

(?!\[\[|\]\]).匹配任何字符,但仅在确保它不是 a[[]]序列的开头之后。

于 2011-01-21T02:25:50.380 回答
3

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

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

这是有效的,因为它找到了最后一个 [[(所以它后面没有更多[[,所以它不能包含任何嵌套标签),然后是紧随其后的]]. 当然,这是假设格式良好;如果您有一个开始/结束括号不正确匹配的字符串,这可能会失败。

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

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

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

于 2011-01-21T02:44:31.267 回答