Требуется регулярное выражение для соответствия нескольким строкам в ответе 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\"\}?

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

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

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.

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