Справка по регулярным выражениям

#regex #xslt

#регулярное выражение #xslt

Вопрос:

Я пытаюсь использовать XSLT для преобразования XML в обычный текст. Один из узлов содержит следующее содержимое, и мне нужно извлечь строку, которая появляется перед текстом «сбой» Я планировал использовать функцию analyze-string и у меня возникли проблемы с созданием регулярного выражения для нее. Я попытался посмотреть, могу ли я использовать шаблон lookahead, но не смог этого сделать.

Может кто-нибудь сказать, каким было бы регулярное выражение для извлечения текста в квадратных скобках перед текстом «сбой»:

Текст

 [[2500, 4500]] fail(expected [[2100, 3000, 4000, 5000, 5400, 6000, 8000, 10000]])
  

Конечный результат

 [2500, 4500]
  

Комментарии:

1. Хороший вопрос, 1. Смотрите мой ответ об однострочном решении XPath 1.0 и, конечно же, о решении XSLT 1.0, которое вообще не использует RegEx. 🙂 Также предоставляется объяснение.

Ответ №1:

/[([. ?])] fail/ и получаем $1 .

Комментарии:

1. Спасибо, приведенное выше регулярное выражение содержит текстовый сбой в нем. Есть ли способ исключить это, а также есть 2 уровня квадратных скобок, я надеялся, что смогу использовать только внутренний уровень. Возможно ли это?

2. Конечно. Используйте это регулярное выражение и воспользуйтесь первым уловом, $1 .

3. Я могу привести пример, если вы скажете мне, какой язык программирования вы используете.

Ответ №2:

Вы можете сделать это даже в XSLT 1.0 (как одно выражение XPath 1.0) без регулярных выражений:

 substring(substring(normalize-space(substring-before(.,' fail')), 2),
          1,
          string-length(substring(
                           normalize-space(substring-before(.,' fail')), 
                           2)
                        ) -1
           )
  

Поскольку ваша цель — сделать это в XSLT, вы можете определить переменные для компонентов этого сложного выражения и получить простой и понятный код:

  <xsl:template match="/">
     <xsl:variable name="vStart" select=
       "normalize-space(substring-before(.,' fail'))"/>

    <xsl:variable name="vnormString" select=
     "normalize-space($vStart)"/>

    <xsl:variable name="vLen" select="string-length($vnormString)"/>

    "<xsl:value-of select="substring($vnormString, 2, $vLen -2)"/>"
 </xsl:template>
</xsl:stylesheet>
  

Когда это преобразование применяется к следующему XML-документу:

 <t>[[2500, 4500]] fail(expected [[2100, 3000, 4000, 5000, 5400, 6000, 8000, 10000]]) </t>
  

получен желаемый, правильный результат:

 "[2500, 4500]"
  

Объяснение: Использование стандартных функций XPath 1.0: substring() , substring-before() , normalize-space() и string-length()