Я пытаюсь создать регулярное выражение для сопоставления нескольких строк из ответа 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\"\}
?
Это вообще возможно?
заранее спасибо
Объединение двух регулярных выражений выполняется простым их объединением. Если вы хотите разрешить произвольные символы между ними, используйте .*
между ними.
Предполагая, что ваши регулярные выражения совпадают по всему ответу, включая заголовки и тело, а не только по отдельным строкам, следующего должно быть достаточно.
HTTP/1\.(0|1) (200|301|302)\r\n(.*?)(\{\"state\":\"RUNNING\"\}|\{\"state\":\"MAINTENANCE\"\})$
Это поможет:
/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.
Обратите внимание, что
.
не соответствует символам новой строки (\n
) по умолчанию.