регулярное выражение - найти конкретный текст между 2 указанными границами - PullRequest
0 голосов
/ 06 октября 2009

Я пытаюсь разработать регулярное выражение, которое будет определять рекурсивные вызовы шаблонов в таблице стилей xsl.

Пока что он не был действительно успешным.

В следующем коде мне нужно обнаружить, что шаблон B вызывается рекурсивно:

<xsl:template name="A"> 
     blah blha ?!@#?%$#^%?*?&(({}:"><;'[]\/.,./'
    <xsl:call-template name="B">  
    blah blah      
</xsl:template>    
<xsl:template name="B"> 
   blah blha 
    <xsl:call-template name="B">                
    blah blah  
</xsl:template>
<xsl:template name="C"> 
     blah blha 
    <xsl:call-template name="B">  
    blah blah  
</xsl:template>

В этом конкретном случае reg ex в порядке.

В случае, если я удаляю второй вызов B, регулярное выражение соответствует последнему вызову B. Этого не должно быть.

(<xsl:template name=\"(?<templateName>\w+)\">.*?(?<=<xsl:call-template name=\"\k<templateName>\">).*?</xsl:template>)+

Я не гуру регулярных выражений. Любая помощь приветствуется.

Спасибо.

1 Ответ

8 голосов
/ 06 октября 2009

Повторяя очевидную мысль: Не пытайтесь анализировать XML или другие нерегулярные языки с помощью регулярных выражений. Пожалуйста.

Используйте синтаксический анализатор XML и посмотрите на получившееся дерево. Вы можете создать шаблон звонков шаблона и искать циклы в этом. Должно быть гораздо более надежным решением, чем пытаться взломать его вместе с регулярными выражениями. Таким образом, вы также можете обнаружить, что шаблон A может вызывать шаблон B, который вызывает шаблон C и который снова вызывает шаблон A. Такие виды рекурсии были бы невидимы для вашего текущего подхода (если бы их можно было убедить работать).

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