2015-02-03 4 views
0

Моя специальная последовательность html. Я хочу сопоставить регион и пункт назначения foreach блоки до} @. Субрегион является вложенной последовательностью и должен быть исключен.regex для поиска самых удаленных последовательностей

@foreach(region){ 
    @foreach(subregion){ 
     @{subregion.name} 
    }@ 
}@ 
@foreach(destination){ 
    @{destination.name} 
}@ 
+0

Что ваш ожидаемый результат? –

+4

'Я хочу 'не вопрос. – Jonesopolis

+0

Вы хотите проверить наличие вложенных парантез? –

ответ

1

Вы должны использовать сбалансированные группы:

@foreach\([^)]*\)\s*{(?>(?<open>@foreach\([^)]*\)\s*{)|@{[^}]*}|[^}@]+|(?<-open>}@))*(?(open)(?!))}@ 

Идея заключается в том, чтобы определить именованный захват, который работает как счетчик. Когда найденная подстрока найдена, счетчик увеличивается, когда найденная подстрока найдена, счетчик уменьшается. (?(open)(?!)) заставляет шаблон сбой, если счетчик не равен нулю.

@foreach\([^)]*\)\s*{ 
(?> # possible content in a foreach 
    (?<open>@foreach\([^)]*\)\s*{) # increment the counter 
    | 
    @{[^}]*} 
    | 
    [^}@]+ # all that is not a @ or } (can be improved to be more flexible) 
    | 
    (?<-open>}@) # decrement the counter 
)* 
(?(open)  # conditional statement (if "open" is not null) 
    (?!)  # then make fail the pattern (with the always false assertion `(?!)`) 
) 
}@ 

demo

+0

Wauw, просто хочу, мне нужно:) –

+0

@Casimir вы могли бы предоставить ссылку для онлайн-теста C# regex? Мне нужно проверить ваше регулярное выражение ... –

+0

@AvinashRaj: Я добавил ссылку. –

Смежные вопросы