正则表达式,TextFSM - 匹配两个字符之间的内容,同时排除不需要的字符串列表

问题描述

开发者社区您好!

我目前正在开发一些 Ansible playbook 来管理 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 关键字之后的双引号之间编写一个匹配 any 内容的正则表达式。开始和结束双引号之间的内容可以包含更多的双引号。

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

我的问题是,如果在 -rule 关键字之后定义了一个可选的 -resRule 关键字,并且 -resRule 关键字之后的文本也包含双引号,内容匹配包括 -rule 和 -resRule 关键字之后的内容

当开始和结束双引号之间的内容包含任何关键字时,是否可以定义“不需要的”关键字列表,匹配在不需要的关键字之前的最后一个双引号结束?

例如,

enter image description here

我正在尝试使用前瞻和非捕获组,但没有运气。

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

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

在此先非常感谢您!

解决方法

您可以使用表达式 -rule\s*(\"(\\\"|[^\"])*\") 只采用参数 -rule 的引用值,主要变化是

  1. 模式以 -rule 开头,
  2. 如果在重复组中转义,则部分会消耗引号, 并消耗额外的最终报价。

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

如果您还想包含未加引号的参数,您可以使用 -rule\s*(\"(\\\"|[^\"])*\"|\S+),其中 \S+ 表示直到下一个空格的字符。

,

您可以匹配 -rule\s* 后跟可选的空白字符和 "

然后匹配除 " 之外的任何字符或匹配转义字符,然后匹配末尾的结束 " do -resRule 将不匹配匹配的一部分。

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

Regex demo

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...