Требуется регулярное выражение для соответствия нескольким строкам в ответе HTML

Я пытаюсь создать регулярное выражение для сопоставления нескольких строк из ответа HTML. Это используется для мониторинга веб-страницы с помощью балансировщика нагрузки. Если регулярное выражение имеет совпадение, балансировщик нагрузки будет рассматривать сервер как UP и будет отправлять трафик.

Пример ожидаемого ответа HTML:

HTTP/1.1 200 
X-AREQUESTID: *1KIRCWLx688x71065x0
X-XSS-Protection: 1; mode=block
X-FRAME-OPTIONS: SAMEORIGIN
X-Content-Type-Options: nosniff
Access-Control-Allow-Origin: *
Content-Type: application/json
Transfer-Encoding: chunked
Content-Encoding: gzip
Vary: Accept-Encoding
Date: Wed, 31 Oct 2018 11:28:14 GMT
{"state":"RUNNING"}

Чего я хочу добиться, так это попытаться сопоставить {"state":"RUNNING"} ИЛИ {"state":"MAINTENANCE"} И HTTP/1.1 200.

Итак, у меня есть следующие рабочие регулярные выражения, но я не знаю, как их связать вместе ;-)

  • \{\"state\":\"RUNNING\"\}|\{\"state\":\"MAINTENANCE\"\}

будет соответствовать {"state":"RUNNING"} ИЛИ {"state":"MAINTENANCE"}

  • HTTP/1\.(0|1) (200|301|302)

будет соответствовать коду ответа HTTP 200, 301 или 302 (например: HTTP/1.1 200)

Итак, как мне создать мега-регулярное выражение при всех условиях?

HTTP/1\.(0|1) (200|301|302) И \{\"state\":\"RUNNING\"\}|\{\"state\":\"MAINTENANCE\"\}?

Это вообще возможно?

заранее спасибо

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
940
2

Ответы 2

Объединение двух регулярных выражений выполняется простым их объединением. Если вы хотите разрешить произвольные символы между ними, используйте .* между ними.

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

HTTP/1\.(0|1) (200|301|302)\r\n(.*?)(\{\"state\":\"RUNNING\"\}|\{\"state\":\"MAINTENANCE\"\})$

Обратите внимание, что . не соответствует символам новой строки (\n) по умолчанию.

elixenide 31.10.2018 13:12

Это поможет:

/HTTP/1\.(0|1) (200|301|302).*?(\{\"state\":\"RUNNING\"\}|\{\"state\":\"MAINTENANCE\"\})/s

Ключевым моментом в этой версии является флаг s, который позволяет . сопоставлять символ новой строки (\n). Демо на regex101.

Другой вариант, без использования флагов:

HTTP/1\.(0|1) (200|301|302)[\s\S]*?(\{\"state\":\"RUNNING\"\}|\{\"state\":\"MAINTENANCE\"\})

Ключевым моментом является [\s\S]*?, который соответствует буквально чему угодно (включая новые строки) не жадным образом. Демо на regex101.

Другие вопросы по теме