C # регулярное выражение для вложенных тегов - PullRequest
2 голосов
/ 21 января 2011

Давайте начнем с небольшого примера; У меня есть следующий текст:

[[некоторый тег [[с вложенным тегом]] и снова]]

Я бы хотел сопоставить [[с вложенным тегом]] , но не [[некоторый тег [[с вложенным тегом]] . Простой

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

явно не сработало. Поэтому я создал регулярное выражение:

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

К сожалению, он ничего не соответствует с помощью C # (с MatchOptions.SingleLine), в то время как PHP preg_match работает отлично.

Какие-нибудь подсказки / идеи? Любая помощь будет высоко ценится.

Ответы [ 2 ]

3 голосов
/ 21 января 2011

Самый простой из известных мне способов найти только одну из самых внутренних скобок - это:

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

Это работает, потому что он находит last [[ (поэтому после него нет больше [[, поэтому он не может содержать вложенных тегов), а затем сразу следующий ]]. Конечно, это предполагает правильность; если у вас есть строка, в которой начальные / конечные скобки не совпадают должным образом, это может привести к ошибке.

Как только вы нашли самую внутреннюю скобку, вы можете удалить ее из строки ввода:

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

, а затем повторите процесс в цикле while, пока регулярное выражение не перестанет совпадать.

3 голосов
/ 21 января 2011

Это будет действительное совпадение?

[[ with [ single ] brackets ]]

Если нет, то это регулярное выражение должно делать:

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

[^][] соответствует любому символу, который не [ или ]. Если допускаются одиночные скобки , попробуйте следующее:

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

(?!\[\[|\]\]). соответствует любому символу, но только после того, как убедитесь, что это не начало последовательности [[ или ]].

...