Давайте начнем с краткого обзора вашего исходного текста (первого, который вы включили).
Он состоит из «секций», разделенных |
char.
Этот символ (|
) должен соответствовать \|
. Помните о предыдущем
обратная косая черта, в противном случае «голый» |
будет означать альтернативный разделитель
(вы использовали его в одном месте).
А теперь взглянем на каждый раздел (между |
):
- Некоторые из них содержат только последовательность слов символов (и могут быть сопоставлены
\w+
).
- Другие разделы, однако, содержат также другие символы , например косая черта,
обратная косая черта, фигурные скобки и точки, поэтому каждый такой раздел на самом деле является последовательностью
символов , отличных от "|" и должны соответствовать
[^|]+
(здесь
между [
и ]
вертикальная черта может быть не экранирована).
Теперь давайте напишем каждый раздел и его «тип»:
sou_u02_..._FW_ALERT
- слово с символами.
/opt/app/.../UnifiedLogging
- другие символы (из-за косой черты).
UL_\d{8}_..._Primary.log.csv
- другие символы (из-за \d{8}
и точки).
FATAL|red|1h
- 3 раздела, состоящие из символов слова.
- пустой раздел, между 2 последовательными
|
символами.
fw_alert
- слово с символами.
А теперь, как сопоставить эти группы и разделяющие |
:
- Точка 1:
\w+\|
- символы слова и (экранированная) вертикальная черта.
- Точки 2 и 3 (вместе):
(?:[^|]+\|){2}
- без захвата
группа - (?:...)
, содержащая последовательность «других» символов - [^|]+
и вертикальная черта - \|
, встречающаяся 2 раза {2}
.
- Пункт 4 (три группы "char слова"):
(?:\w+\|){3}
- аналогично
предыдущий пункт.
- Пункт 5: Как и в вашем решении -
([^|]+|)\|
, группа захвата -
(...)
, с 2 альтернативами ...|...
. Первая альтернатива
[^|]+
(последовательность «других» символов) и вторая альтернатива
пустой. После группы захвата есть \|
, чтобы соответствовать вертикали
бар.
- Точка 6:
\w+
- слово символов. На этот раз нет \|
, так как это последний
раздел.
Собранное на данный момент регулярное выражение должно быть:
- с добавлением
^
(начало строки) и
- с добавлением
$
(конец строки).
Таким образом, все регулярные выражения, соответствующие вашему исходному тексту, могут быть:
^\w+\|(?:[^|]+\|){2}(?:\w+\|){3}([^|]+|)\|\w+$
На самом деле, единственная группа захвата может быть написана по-другому,
как ([^|]*)
- без альтернатив, но с *
в качестве
количество повторений, позволяющее также пустой контент.
Ваш выбор, какой вариант применить.