如果下面的缩进行中还有另一个已定义的文本(此处为“交换端口模式访问”),我想匹配以特定字符串(在此示例中为“ 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
Run Code Online (Sandbox Code Playgroud)
应该匹配:
interface GigabitEthernet1/0/1
interface GigabitEthernet1/0/4
Run Code Online (Sandbox Code Playgroud)
我试过了:
interface GigabitEthernet1\/0\/[0-9](?=(\n|.)*switchport mode access)
Run Code Online (Sandbox Code Playgroud)
但这会检查接口下的所有行,因此它确实匹配:
interface GigabitEthernet1/0/1
interface GigabitEthernet1/0/2
interface GigabitEthernet1/0/3
interface GigabitEthernet1/0/4
Run Code Online (Sandbox Code Playgroud)
如何使前行仅在行不以空格开头之前起作用?
您可以使用这种基于前瞻性的表达式,该表达式仅在其后跟且中间switchport mode access
不interface GigabitEthernet
出现所需字符串时才与您期望的字符串匹配,
interface GigabitEthernet1.*(?=(?:(?!interface GigabitEthernet1)[\w\W])*switchport mode access)
Run Code Online (Sandbox Code Playgroud)
interface GigabitEthernet1.*
仅在紧随其后的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)
Run Code Online (Sandbox Code Playgroud)