Regex, TextFSM - соответствие содержимого между двумя символами, исключая ненужный список строк.

Привет, Сообщество разработчиков!

В настоящее время я работаю над разработкой некоторых руководств Ansible для управления конфигурацией Citrix NetScaler и хотел бы попросить помощи по следующим вопросам.

У меня есть следующая строка конфигурации, которую я хотел бы проанализировать с помощью TextFSM:

add lb vserver VS_ssl_443_testapps SSL 0.0.0.0 0 -persistenceType RULE -timeout 30 -rule "HTTP.REQ.COOKIE.VALUE(\"JSESSIONID\")" -resRule "HTTP.RES.SET_COOKIE.COOKIE(\"JSESSIONID\").VALUE(\"JSESSIONID\")" -cltTimeout 600 -td 1

Мне нужно было бы написать регулярное выражение, соответствующее любому содержимому, в двойных кавычках после ключевого слова -rule. Содержимое между начальными и конечными двойными кавычками может содержать больше двойных кавычек.

"HTTP.REQ.COOKIE.VALUE(\"JSESSIONID\")"

Моя проблема в том, что, если после ключевого слова -rule указано необязательное ключевое слово -resRule, а текст после ключевого слова -resRule также содержит двойные кавычки, соответствие содержания включает содержимое после ключевых слов -rule и -resRule.

Можно ли определить список нежелательных ключевых слов, когда содержимое между начальным и конечным двойными кавычками содержит любое из ключевых слов, а совпадение заканчивается на последнем двойном кавычках перед нежелательным ключевым словом?

Так, например,

введите описание изображения здесь

Я пытаюсь поиграть с прогнозирующими и не захватывающими группами, но безуспешно.

https://regex101.com/r/UkPr05/1

(((\")(.*)(\"))(?:( -resRule.*)))

Заранее большое спасибо!


person Belabacsi    schedule 10.02.2021    source источник


Ответы (2)


Вы можете использовать выражение -rule\s*(\"(\\\"|[^\"])*\"), которое будет принимать только указанное в кавычках значение аргумента -rule, ключевые изменения:

  1. Шаблон начинается с -rule,
  2. части потребляют цитату, если она экранирована в повторяющейся группе, и потребляют дополнительную заключительную цитату.

https://regex101.com/r/HoCM1v/1/

Если вы хотите включить параметры без кавычек, вы можете использовать -rule\s*(\"(\\\"|[^\"])*\"|\S+), где \S+ представляет символы до следующего пробела.

person Bob    schedule 10.02.2021
comment
Спасибо, это решение работает как шарм :-) - person Belabacsi; 15.02.2021

Вы можете сопоставить -rule\s*, за которым следует необязательные пробельные символы и "

Затем сопоставьте любой символ, кроме ", или сопоставьте экранированный символ, за которым следует сопоставление закрывающего " в конце do -resRule не будет соответствовать части совпадения.

-rule\s*"([^"\\]*(?:\\.[^"\\]*)*)"

Демонстрация Regex

person The fourth bird    schedule 10.02.2021