1

我是一名编程技能有限的网络工程师,我使用基于 NET4.0 的名为 dnGREP 的工具在常见文本文件中搜索文本。作为我工作的一部分,我需要做的是找到适用于任何接口配置的命令。

我的想法是试图找到受两个项目限制的正确正则表达式。但是在尝试构建高效的 REGEX 时,我遇到了几个问题。

从 Cisco 设备的“显示运行配置”中获取以下字符串:

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
 !    

可以看到,接口配置可以限制为2项。

起始项目:

    interface

最终项目:

 !

给定一个字符串,我想要一个匹配字符串以及接口上下文的正则表达式。

条件:

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

到目前为止,这是我的正则表达式:

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

分解:

^interface--“当“interface”为行首时开始搜索。”

([\s\S]*?----"搜索任何字符,包括换行"

找到我----“找到我是我正在寻找的字符串/命令”

([\s\S]*?!----"继续打印直到找到! "

当然,上面的 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 me但是如果在到达时找不到字符串find me,它应该停止声明不匹配但是它应该继续到文件末尾并打印包含的所有接口上下文字符串找到我

我希望我的解释清楚。非常感谢任何帮助=)。

4

1 回答 1

1

尝试以下正则表达式:

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

解释:

interface\s*- 单词“interface”后跟 0 个或多个空格;

(?<text>[^!]+find me[^!]+)-text包含除“!”之外的任何字符、1 个或多个重复和字符串“find me”的组;

(?:!)?- 匹配 ”!” 字符,但不要捕获它,0 或 1 次重复(以适应最后一段,如果字符丢失)。

于 2012-07-04T04:15:13.413 回答