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

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

Пример ожидаемого 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\"\} ?

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

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


person Thomas    schedule 31.10.2018    source источник


Ответы (2)


Это поможет:

/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.

person elixenide    schedule 31.10.2018

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

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

HTTP\/1\.(0|1) (200|301|302)\r\n(.*?)(\{\"state\":\"RUNNING\"\}|\{\"state\":\"MAINTENANCE\"\})$
person Corion    schedule 31.10.2018
comment
Обратите внимание, что . не соответствует символам новой строки (\n) по умолчанию. - person elixenide; 31.10.2018