networking工程师正则expression式 – 查找两个分隔符之间的string给出的上下文

我是一名编程技能有限的networking工程师,我使用了一个名为dnGREP的工具,它基于NET4.0,用于在普通文本文件中search文本。 作为我工作的一部分,我需要做的是find适用于任何接口configuration的命令。

我的想法是试图find两个项目限制正确的REGEX。 但是在尝试构build高效的REGEX时遇到了一些问题。

从思科设备的“show running-configuration”中取出以下string:

interface GigabitEthernet0/0/0/1.1982 ipv4 address 10.111.193.125 255.255.255.252 ipv4 unreachables disable load-interval 30 dot1q vlan 1982 ! interface GigabitEthernet0/0/0/1.1983 ipv4 address 10.113.193.125 255.255.255.252 ipv4 unreachables disable load-interval 30 dot1q vlan 1983 ! interface GigabitEthernet0/0/0/2.1982 ipv4 address 10.111.193.129 255.255.255.252 ipv4 unreachables disable load-interval 30 find me dot1q vlan 1982 ! 

正如你所看到的,接口configuration可以被2个项目限制。

开始项目:

  interface 

结束项目:

  ! 

给定一个string,我想要一个REGEX匹配string以及接口上下文。

条件:

  • REGEX应该返回由“interface”分隔的接口上下文,直到“!”。
  • REGEX应该打印所有的出现

这是我到目前为止的REGEX:

  ^interface([\s\S]*?)find me([\s\S]*?)! 

分解:

^界面 – “开始search时,”界面“是行的开始。”

([\ s \ S] *?—-“search包含新行的任何字符”

find我—-“find我是我正在寻找的string/命令”

([\ s \ S] *?!—-“继续打印直到find

当然,以上REGEX不会做我期望的。 它应该只返回这个:

 interface GigabitEthernet0/0/0/2.1982 ipv4 address 10.111.193.129 255.255.255.252 ipv4 unreachables disable load-interval 30 find me dot1q vlan 1982 ! 

相反,它返回所有的东西后,第一个界面被发现这不是我想要的。

我知道这是为什么发生,但我不知道如何纠正。

“当find第一个接口时,正则expression式开始寻找find我 ,但是当findstring时,如果没有findstring,应该停止 声明不匹配但是它应该继续,直到文件结束并且打印所有包含接口上下文的接口上下文stringfind我

我希望我的解释清楚。 任何帮助真的很感激=)。

尝试下面的正则表达式:

 interface\s*(?<text>[^!]+find me[^!]+)(?:!)? 

说明:

interface\s* – “界面”一词,后跟0个或多个空格;

(?<text>[^!]+find me[^!]+) – 包含除“!”之外的任何字符,1次或更多次重复以及字符串“find me”的组text

(?:!)? – 匹配 ”!” 字符,但不捕捉它,0或1个重复(为了迎合最后一段,如果字符丢失)。