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

В настоящее время я работаю над разработкой некоторых руководств для 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.

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

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

enter image description here

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

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

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

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

0
Belabacsi 10 Фев 2021 в 15:46

2 ответа

Лучший ответ

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

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

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

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

2
user12750353 10 Фев 2021 в 13:01

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

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

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

Regex demo

0
The fourth bird 10 Фев 2021 в 18:16
66137175