Преобразование Regexp в POSIX BRE

Я хотел бы поместить это выражение в POSIX BRE.

HTTP\/[\d.]+.\s+(?:403)\s+(4[0-9])\s+

Вот что я придумал до сих пор.

HTTP\/[0-9.]{1,}.[[:blank:]]{1,}403[[:blank:]]{1,}(4[0-9])[[:blank:]]

При использовании средства проверки регулярных выражений в Интернете оба примера работают достаточно хорошо. Однако это регулярное выражение необходимо зарегистрировать в SCOM, и похоже, что оно поддерживает только POSIX BRE для мониторинга серверов Linux.


person i716    schedule 28.10.2019    source источник


Ответы (1)


Вот документация Posix по базовым регулярным выражениям. В частности, обратите внимание:

  1. Когда за BRE, совпадающим с одним символом, подвыражением или обратной ссылкой, следует интервальное выражение формата \{m\}, \{m,\} или \{m,n\}, вместе с этим интервальным выражением оно должно соответствовать тому, какие повторяющиеся последовательные вхождения BRE будут соответствовать

Итак, [[:blank:]]{1,} не собирается делать то, что вы думаете; перед фигурными скобками должна стоять обратная косая черта.

С другой стороны, большинство реализаций BRE позволяют использовать \+ для обозначения «одного или нескольких повторений». По крайней мере, разновидности BSD и Gnu. Таким образом, вы вполне можете написать это как [[:blank:]]\+ вместо использования числового оператора повторения [[:blank:]]\{1,\}.

Наконец, [[:blank:]] может быть не тем, что вам нужно. По крайней мере, это не соответствует тому же, что и \s. [[:blank:]] соответствует только символам пробела и табуляции ([ \t]). Но в большинстве библиотек регулярных выражений \s совпадает с [ \t\r\n\f\v], которому соответствует [[:space:]] в регулярном выражении C (или функция isspace() в коде C). Наиболее заметная разница между [[:blank:]] и \s (или [[:space:]]) заключается в том, что [[:blank:]] не соответствует новой строке. Возможно, это нормально в вашем приложении.

Педантичное примечание. Некоторые библиотеки регулярных выражений определяют \s как [ \t\r\n\f], но вы вряд ли заметите разницу. И все эти списки символов предполагают, что регулярное выражение было скомпилировано в локали «C». Если библиотека регулярных выражений поддерживает локаль и включена какая-то другая локаль, могут совпадать дополнительные символы.

person rici    schedule 28.10.2019
comment
Благодарим Вас за разъяснения. Я должен был упомянуть, что агент SCOM Linux отслеживает файл журнала nginx для части HTTP/1.1 403 48 (где число после кода ошибки 403 представляет собой двузначное число в диапазоне 40-49) какой-то текст HTTP/1.1 403 48 - какой-то текст - person i716; 28.10.2019
comment
Также ( и ) должны иметь обратную косую черту, и, с другой стороны, нет необходимости использовать обратную косую черту / (если, например, ваш инструмент не использует буквальные косые черты в качестве разделителя регулярных выражений в синтаксисе основного языка). - person tripleee; 06.11.2020