[英]Regex Lookahead to match based on indented text
如果在以下缩进行中有另一个定义的文本(此处为“switchport mode access”),我想匹配以特定字符串(在此示例中为“interface”)开头的行。
示例数据:
interface GigabitEthernet1/0/1
description abc
bla
switchport mode access
xyz
abc
interface GigabitEthernet1/0/2
interface GigabitEthernet1/0/3
xyz
abc
interface GigabitEthernet1/0/4
description Test
switchport mode access
xyz
abc
interface GigabitEthernet1/0/5
description
应该匹配:
interface GigabitEthernet1/0/1
interface GigabitEthernet1/0/4
我试过:
interface GigabitEthernet1\/0\/[0-9](?=(\n|.)*switchport mode access)
但这会检查界面下方的所有行,因此它确实匹配:
interface GigabitEthernet1/0/1
interface GigabitEthernet1/0/2
interface GigabitEthernet1/0/3
interface GigabitEthernet1/0/4
我怎样才能让前瞻只工作,直到有一行不以空格开头?
您可以使用这个基于前瞻的表达式,该表达式将匹配您想要的字符串,前提是它后面是switchport mode access
,中间没有interface GigabitEthernet
,
interface GigabitEthernet1.*(?=(?:(?!interface GigabitEthernet1)[\w\W])*switchport mode access)
interface GigabitEthernet1.*
匹配直到行尾,仅当它后面是switchport mode access
而在使用(?=(?:(?!interface GigabitEthernet1)[\\w\\W])*switchport mode access)
之间没有出现interface GigabitEthernet1
时(?=(?:(?!interface GigabitEthernet1)[\\w\\W])*switchport mode access)
积极展望
编辑:感谢 Anubhav 在评论中的建议,以获得更好的正则表达式,
^interface GigabitEthernet1\/0\/[0-9](?=(?:(?!\ninterface GigabitEthernet1\/0\/[0-9])[\s\S])*switchport mode access)
使用以下正则表达式后捕获 Group 1 的内容:
(interface GigabitEthernet.*)(?:(?!interface GigabitEthernet)[\s\S])*switchport mode access
解释:
(interface GigabitEthernet.*)
- Tempered Greedy Token - 匹配interface GigabitEthernet
后跟任何字符的 0+ 次出现,直到换行符并在组 1 中捕获整个匹配(?:(?!interface GigabitEthernet)[\\s\\S])*
- 匹配 0+ 次出现的任何不以子字符串interface GigabitEthernet
开头的字符switchport mode access
- 匹配switchport mode access
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.