如果在下面的缩进行中有另一个定义的文本(此处为“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
之间使用(?=(?:(?!interface GigabitEthernet1)[\w\W])*switchport mode access)
正向前看
编辑:感谢Anubhav在评论中提出的建议,即使是表现更好的正则表达式,
^interface GigabitEthernet1\/0\/[0-9](?=(?:(?!\ninterface GigabitEthernet1\/0\/[0-9])[\s\S])*switchport mode access)
使用以下正则表达式后捕获组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