如果后面的缩进行中还有另一个已定义的文本(此处为“交换端口模式访问”),我想匹配以特定字符串开头的行(在此示例中为“ 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
如何使前瞻功能仅在一行不以空格开头的情况下才起作用?
答案 0 :(得分:4)
您可以使用这种基于前瞻性的表达式,仅在后跟switchport mode access
且中间没有interface GigabitEthernet
的情况下,才匹配所需的字符串。
interface GigabitEthernet1.*(?=(?:(?!interface GigabitEthernet1)[\w\W])*switchport mode access)
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)
答案 1 :(得分:3)
使用以下正则表达式捕获第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