Как перехватить второе слово кода статуса http с помощью регулярных выражений? - PullRequest
0 голосов
/ 22 января 2019

Я хочу записать имя кода состояния http с помощью регулярных выражений.

Это пример текста записи файла журнала:

Completed in 0.01434 (69 reqs/sec) | Rendering: 0.00006 (0%) | DB: 0.00220 (15%) | 404 Not Found [https://www.sample.com/page/soaps/1.xml]

Как всем известно, код состояния http варьируется для каждогозапись файла журнала.Это может быть одно из следующих значений:

200 OK 
401 Unauthorized
201 Created
422 Unprocessable Entity
302 Found
404 Not Found

Моя группа захвата должна содержать одно из следующего:

OK 
Unauthorized
Created
Unprocessable Entity
Found
Not Found

Мое текущее выражение регулярного выражения выглядит следующим образом:

\D+(\d+(?:\.\d+)?\s*\([^)]+\))\D+(\d+(?:\.\d+)?\s*\([^)]+\))\D+(\d+(?:\.\d+)?\s*\([^)]+\))\D+(\d{1,3})\D+([A-Z]{2}|[A-Z][a-z]{1,12}(\s[A-Z][a-z]{1,10})?)\D+(\[.*\])\K

Но если вы запустите его на сайте www.regex101.com, вы увидите, что он не регистрирует код состояния http с двумя словами (то есть, «Необработанный объект» и «Не найден»).

Что яделать неправильно?

1 Ответ

0 голосов
/ 22 января 2019

Вы можете использовать это регулярное выражение

.*\| (\d+)\s+((?:\w|[^\S\r\n])*)

Первая группа захвата - это код ошибки, а вторая - сообщение.Обратите внимание, что это не захватывает ссылку и работает, если ссылки нет.Части следующие:

  • . * \ |-> точка - жадное совпадение, поэтому она захватывает все до последней |
  • первая группа захвата
    • \ d + -> одна или несколько цифр
  • \ s + -> один или несколько пробелов
  • вторая группа захвата
    • ?: -> сигнализирует, что эта группа не является группой захвата.
    • любой символ слова или любой пробел, но без новых строк ноль или более (если вы уверены, что есть сообщение, вы можете заменить звездочку на плюс)

Чтобы не захватывать новую строку, я поставил двойное отрицательное регулярное выражение.\S означает отсутствие пробелов, и я отрицаю это с помощью ^.Таким образом, [^S\r\n] означает отсутствие пробелов, кроме новой строки.

...