Regex Lookahead基于缩进文本进行匹配

问题描述 投票:1回答:2

如果在下面的缩进行中有另一个定义的文本(此处为“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

如果有一行不以空格开头,我怎样才能使前瞻工作正常?

regex lookahead
2个回答
4
投票

你可以使用这个与你想要的字符串相匹配的前瞻性表达式,只要它后面跟着没有switchport mode accessinterface GigabitEthernet

interface GigabitEthernet1.*(?=(?:(?!interface GigabitEthernet1)[\w\W])*switchport mode access)

interface GigabitEthernet1.*匹配到行尾只有当它后面是switchport mode access而没有发生interface GigabitEthernet1之间使用(?=(?:(?!interface GigabitEthernet1)[\w\W])*switchport mode access)正向前看

Demo

编辑:感谢Anubhav在评论中提出的建议,即使是表现更好的正则表达式,

^interface GigabitEthernet1\/0\/[0-9](?=(?:(?!\ninterface GigabitEthernet1\/0\/[0-9])[\s\S])*switchport mode access)

Faster regex as suggested by Anubhava


3
投票

使用以下正则表达式后捕获组1的内容:

(interface GigabitEthernet.*)(?:(?!interface GigabitEthernet)[\s\S])*switchport mode access

Click for Demo

说明:

  • (interface GigabitEthernet.*) - Tempered Greedy Token - 匹配interface GigabitEthernet,然后出现任意字符的0+,直到换行符并在第1组中捕获整个匹配
  • (?:(?!interface GigabitEthernet)[\s\S])* - 匹配不以子字符串开头的任何字符的0+次出现interface GigabitEthernet
  • switchport mode access - 匹配switchport mode access
© www.soinside.com 2019 - 2024. All rights reserved.