Ad Widget

Collapse

Preprocessing. Запутался.

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • asraill
    Member
    • Aug 2010
    • 35

    #1

    Preprocessing. Запутался.

    Добрый день.
    Помогите пожалуйста создать выражение для preprocessing item.
    Исходные данные - item, текст.
    Выражение должно показывать значение "test", если приходит пустая строка. Если строка не пустая, то должно показать значение.

    Пробовал
    Patern - ^$ Output - test - пустые строки заменяет строкой test, а на не пустые ругается, что не удовлетворяет условию.
  • Victor Vislobokov
    Senior Member
    • Aug 2018
    • 298

    #2
    Читаните эту статью: http://www.schatenseite.de/en/2018/0...r-expressions/
    Мне помогло

    Comment

    • Kos
      Senior Member
      Zabbix Certified SpecialistZabbix Certified Professional
      • Aug 2015
      • 3404

      #3
      Вроде бы, в версии 4.2 стало можно подобные вещи делать непосредственно (указывая, что именно подставлять в случае, когда нет совпадения с регулярным выражением).
      До этой версии можно только слегка извращаться с регулярными выражениями в несколько шагов. Пример таких извращений можно найти в этой теме (начиная с третьего сообщения).

      Comment

      • Evgeniy
        Senior Member
        • May 2012
        • 157

        #4
        Тестера под рукой нет, но я бы попробовал что-то типа ^()$|.* \1test

        Comment

        • asraill
          Member
          • Aug 2010
          • 35

          #5
          Originally posted by Evgeniy
          Тестера под рукой нет, но я бы попробовал что-то типа ^()$|.* \1test
          В этом случае, как и в том что я писал, если у item не пустое значение, то он уходит в not supported.

          Comment

          • Semiadmin
            Senior Member
            • Oct 2014
            • 1625

            #6
            Например, так:
            Code:
            (\w+)*                           \1test
            (.+)test$|^(test)$                   \1\2

            Comment

            • asraill
              Member
              • Aug 2010
              • 35

              #7
              Originally posted by Semiadmin
              Например, так:
              Code:
              (\w+)* \1test
              (.+)test$|^(test)$ \1\2
              Спасибо огромное! то что нужно.
              Я вроде тоже сделал свой вариант, но он намного более громоздкий, и кривой. Напишу для примера, чтоб так не делали:

              Code:
              1шаг (^$)?(?:.*)$                        :\0=1:test=\12
              2шаг (test|(?<=:).*?(?==))(?=.*?=(\d))   \1
              Last edited by asraill; 19-06-2019, 21:13.

              Comment

              • Kos
                Senior Member
                Zabbix Certified SpecialistZabbix Certified Professional
                • Aug 2015
                • 3404

                #8
                Originally posted by Victor Vislobokov
                Читаните эту статью: http://www.schatenseite.de/en/2018/0...r-expressions/
                Мне помогло
                Вот, кстати, спасибо за эту ссылку.
                Там описан любопытный механизм преобразования значений по словарю при помощи регулярных выражений.
                С его помощью я смог, например, настроить препроцессинг на преобразование возвращаемой даты из формата 09/Aug/2019 в 20190809 (что можно непосредственно сравнивать с тем, что возвращается триггерной функцией date()). Наверное, в случае, если бы число месяца могло быть однозначным, то пришлось бы добавить ещё шаг-другой для проверки и добавления нуля перед ним, но в моём случае во входных данных и так число всегда двузначное, а вот месяц обозначается строкой (первые три буквы английского названия месяца), которые надо заменить цифрами; да ещё и поменять порядок (число/месяц/год на год/месяц/число) и убрать разделители.

                Результат публикую тут - вдруг ещё кому пригодится. (Правда, пришлось активно использовать тег "CODE", иначе движок форума всё время пытался что-то отформатировать по-своему, да ещё заменить какие-то фрагменты смайликами.)

                Итак, предобработка состоит из двух шагов, оба шага - тип "регулярное выражение":
                Шаг Регулярное выражение Подстановка
                1
                Code:
                (.*)
                Code:
                \1:Jan=01:Feb=02:Mar=03:Apr=04:May=05:Jun=06:Jul=07:Aug=08:Sep=09:Oct=10:Nov=11:Dec=12
                2
                Code:
                ([^\/]+)\/(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\/([^:]+)(?=.*:\2=(\d+))
                Code:
                \3\4\1
                Магия работает следующим образом.

                Первый шаг простой: переписываем текущее содержимое строки, а в её конец добавляем свой словарь. Важно, что используемые в словаре разделители (в данном случае - знак равенства и двоеточие) не встречаются в исходной строке.
                Результат преобразований после первого шага:
                Было:
                Code:
                09/Aug/2019
                Стало:
                Code:
                09/Aug/2019:Jan=01:Feb=02:Mar=03:Apr=04:May=05:Jun=06:Jul=07:Aug=08:Sep=09:Oct=10:Nov=11:Dec=12

                Второй шаг сложнее. В его регулярном выражении определены несколько capturing groups, которые используются в подстановках.
                Первая capturing group: ([^\/]+) определяет шаблон для числа месяца (начало исходной строки до первой косой черты). В подстановке мы его поместим в самый конец.
                Вторая capturing group: (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) соответствует названию месяца в исходной строке между двумя косыми чертами. В подстановке она не используется, зато используется дальше в том же регулярном выражении, где на неё есть ссылка.
                Третья capturing group: ([^:]+) задаёт шаблон для номера года (после названия месяца и косой черты, но перед двоеточием). В подстановке мы поместим этот номер года в самое начало.
                Наконец, последняя группа: (?=.*:\2=(\d+)) создаёт группировку без обратной связи (?=), поскольку ссылки на неё нам не нужны. Но внутри неё есть четвёртая capturing group: (\d+), которая выбирает из словаря число, соответствующее названию месяца. И именно это число подставляется в середину результирующей строки. Чтобы извлечь нужное число, в этой группе ищется идущее после двоеточия название месяца (которое ранее попало во вторую capturing group), после которого идёт знак равенства и цифры. Именно эти цифры и попадают в четвёртую capturing group, которая и используется в подстановке. Сам словарь в результирующей строке нам не нужен, поэтому в подстановку он не попадает.

                Результат:
                Code:
                [FONT=courier new][B][COLOR=#00FF00]09[/COLOR][/B]/[COLOR=#0000FF]Aug[/COLOR]/[COLOR=#FF0000]2019[/COLOR]:[COLOR=#A9A9A9]Jan=01:Feb=02:Mar=03:Apr=04:May=05:Jun=06:Jul=07:Aug=[/COLOR][B][COLOR=#008000]08[/COLOR][/B]:Sep=09:Oct=10:Nov=11:Dec=12[/FONT]
                09 - первая capturing group
                Aug - вторая capturing group
                2019 - третья capturing group
                Code:
                [COLOR=#A9A9A9]Jan=01:Feb=02:Mar=03:Apr=04:May=05:Jun=06:Jul=07:Aug=[/COLOR][B][COLOR=#008000]08[/COLOR][/B]
                - группа без обратной связи
                08 - четвёртая capturing group

                Соответственно, после подстановки \3\4\1 результат получается: 20190809
                Last edited by Kos; 24-07-2019, 16:18.

                Comment

                Working...