Преобразуйте регулярное выражение в POSIX BRE - PullRequest
0 голосов
/ 28 октября 2019

Я бы хотел поместить это выражение в 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.

Спасибо за ваш вклад

1 Ответ

1 голос
/ 28 октября 2019

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

Когда за 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". Если библиотека регулярных выражений ориентирована на локали, а некоторые другие локали включены, дополнительные символы могут совпадать.

...