создать универсальное регулярное выражение для строки в Perl - PullRequest
0 голосов
/ 02 июля 2018

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

STRING sou_u02_mlpv0747_CCF_ASB001_LU_FW_ALERT|/opt/app/medvhs/mvs/applications/cm_vm5/fwhome/UnifiedLogging|UL_\d{8}_CCF_ASB001_LU_sou_u02_mlpv0747_Primary.log.csv|FATAL|red|1h||fw_alert

REGEX----> /^[^#]\w+\|[^\|]+\|\w+\|\w+\|\w*\|\w*\|([^\|]+|)\|\w*$/

Я не могу понять ошибку здесь.

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

/^[^#]\w+\|[^\|]+\|([^\|]+|)\|[rm]\|(in|out|old|new|arch|missing)\|\w+\|([0-9-,]+|)\|\w*\|\w*$/

sou_u02_mlpv0747_CCF_ASB001_LU_ODR|/opt/app/medvhs/mvs/applications/cm_vm5/components/CCF_ASB001_LU/SPOOL/ODR||r|out|30m|0400-1959|30m|gprs_in_stag

Может кто-нибудь, пожалуйста, помогите мне. Любые ссылки будут высоко оценены.

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Давайте начнем с краткого обзора вашего исходного текста (первого, который вы включили).

Он состоит из «секций», разделенных | char.

Этот символ (|) должен соответствовать \|. Помните о предыдущем обратная косая черта, в противном случае «голый» | будет означать альтернативный разделитель (вы использовали его в одном месте).

А теперь взглянем на каждый раздел (между |):

  • Некоторые из них содержат только последовательность слов символов (и могут быть сопоставлены \w+).
  • Другие разделы, однако, содержат также другие символы , например косая черта, обратная косая черта, фигурные скобки и точки, поэтому каждый такой раздел на самом деле является последовательностью символов , отличных от "|" и должны соответствовать [^|]+ (здесь между [ и ] вертикальная черта может быть не экранирована).

Теперь давайте напишем каждый раздел и его «тип»:

  1. sou_u02_..._FW_ALERT - слово с символами.
  2. /opt/app/.../UnifiedLogging - другие символы (из-за косой черты).
  3. UL_\d{8}_..._Primary.log.csv - другие символы (из-за \d{8} и точки).
  4. FATAL|red|1h - 3 раздела, состоящие из символов слова.
  5. пустой раздел, между 2 последовательными | символами.
  6. fw_alert - слово с символами.

А теперь, как сопоставить эти группы и разделяющие |:

  • Точка 1: \w+\| - символы слова и (экранированная) вертикальная черта.
  • Точки 2 и 3 (вместе): (?:[^|]+\|){2} - без захвата группа - (?:...), содержащая последовательность «других» символов - [^|]+ и вертикальная черта - \|, встречающаяся 2 раза {2}.
  • Пункт 4 (три группы "char слова"): (?:\w+\|){3} - аналогично предыдущий пункт.
  • Пункт 5: Как и в вашем решении - ([^|]+|)\|, группа захвата - (...), с 2 альтернативами ...|.... Первая альтернатива [^|]+ (последовательность «других» символов) и вторая альтернатива пустой. После группы захвата есть \|, чтобы соответствовать вертикали бар.
  • Точка 6: \w+ - слово символов. На этот раз нет \|, так как это последний раздел.

Собранное на данный момент регулярное выражение должно быть:

  • с добавлением ^ (начало строки) и
  • с добавлением $ (конец строки).

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

^\w+\|(?:[^|]+\|){2}(?:\w+\|){3}([^|]+|)\|\w+$

На самом деле, единственная группа захвата может быть написана по-другому, как ([^|]*) - без альтернатив, но с * в качестве количество повторений, позволяющее также пустой контент. Ваш выбор, какой вариант применить.

0 голосов
/ 02 июля 2018

Третье поле

UL_\d{8}_CCF_ASB001_LU_sou_u02_mlpv0747_Primary.log.csv

Содержит обратную косую черту, \, фигурные скобки { } и точки .. Ни один из них не может быть сопоставлен с \w

Обратите внимание, что нет необходимости экранировать канал | внутри класса символов: [^|]+ отлично

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