Как сопоставить всю мою строку с регулярным выражением, допуская вложенные шаблоны - PullRequest
0 голосов
/ 01 февраля 2019

Мое текущее регулярное выражение соответствует только вложенному шаблону, а не внешнему шаблону @if .... endif @.Как я могу изменить свое выражение, чтобы оно соответствовало внешнему шаблону.Если самый внешний шаблон удаляется из строки, выражение должно соответствовать всем перед вложенными шаблонами.Многие или шаблоны or имеют отношение только к реальному миру.

Regex:

(?<match>
@if\((?<statement>[^)]*)\){(?<ifblock>(?>
(?<open>@if\([^)]*\){)
    |<script[^>]+>.*?</script>
    |(?<valuetag>\@{(?<tag>[^}]+)})(?:(?:(\.|\$))(?<action>[^)@]+[)]))?
    |(?<configtag>@(?:(?<tagtype>cc|dc|sc|wc)){(?<tag>[^}\.]*)(?:(?:\.)(?<action>(?:ToLower|ToUpper|MaxLength)))?}(?:cc|dc|sc|wc)@)
    |(?<match>@weeknumber{(?<date>((?<valuetag>\@{(?<tag>[^}]+)})(?:(?:(\.|\$))(?<action>[^)@]+[)]))?|((0[1-9]|[12][0-9]|3[01])[-](0[1-9]|1[012])[-](19|20)\d\d)))}weeknumber@)
    |(?<tag>\@{(?<tagname>[^}]+)}[.]ReplaceText\((?<replace>[^;]+)[;]{1}(?<with>[^)]+)\))
    |(?<match>@(block|if)\((?<statement>[^)]*)\){(?<ifblock>.*)(?=)}end(block|if)@)
    |[^}@]+
    |@{value(\.[A-Z][0-9])?}
    |(?<-open>}endif@)
)*)
(?(open)(?!))
(
}else{(?<elseblock>(?>
(?<open>@if\([^)]*\){)
    |<script[^>]+>.*?</script>
    |(?<valuetag>\@{(?<tag>[^}]+)})(?:(?:(\.|\$))(?<action>[^)@]+[)]))?
    |(?<configtag>@(?:(?<tagtype>cc|dc|sc|wc)){(?<tag>[^}\.]*)(?:(?:\.)(?<action>(?:ToLower|ToUpper|MaxLength)))?}(?:cc|dc|sc|wc)@)
    |(?<match>@weeknumber{(?<date>((?<valuetag>\@{(?<tag>[^}]+)})(?:(?:(\.|\$))(?<action>[^)@]+[)]))?|((0[1-9]|[12][0-9]|3[01])[-](0[1-9]|1[012])[-](19|20)\d\d)))}weeknumber@)
    |(?<tag>\@{(?<tagname>[^}]+)}[.]ReplaceText\((?<replace>[^;]+)[;]{1}(?<with>[^)]+)\))
    |(?<match>@(block|if)\((?<statement>[^)]*)\){(?<ifblock>.*)(?=)}end(block|if)@)
    |[^}@]+
    |@{value(\.[A-Z][0-9])?}
    |(?<-open>}endif@)
)*)
(?(open)(?!))
)?
}endif@)

Строка:

        @if(base.SiteBID=='SOS'){
    <div class="floatleft reviewcontainer_outer" onclick="@if(base.IsSmartPhone=='False'){toogleReviewModalLightbox('@{house.id}', 0, 10);}endif@">
        @if(house.latestreview.amount<greaterthen>2){<div class="sos_sprite reviews@{house.category} sos_inline onlinecat_review_gfx@{house.latestreview.totalrankcss} floatleft reviewcontainer_sprite" title="@{house.latestreview.totalrank}"></div><p class="broedtekst floatleft link">@{house.latestreview.amount} @cc{txt_guestbook_result}cc@</p>}endif@
    </div>
                            @if(base.IsSmartPhone=='False'){toogleReviewModalLightbox('@{house.id}', 0, 10);}else{jhfr}endif@
    }endif@

Я хочу, чтобы выражение соответствовало целомустрока от @if до endif @

1 Ответ

0 голосов
/ 01 февраля 2019

Я пытался с этим, и они работали:

(@if.+\\n+\\D+.*\\W+.*\\B.*\\n.*\\n.*\\n.*endif@)

Этот ниже выглядит короче.

(@if.+\\n+\\D+.*\\W+.*\\B.*\\n.*\\n.*\\n.*)

Обе работы.Проверено на regex101.com

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...