正则表达式先行匹配以缩进文本为基础

时间:2019-03-19 06:43:35

标签: regex lookahead

如果后面的缩进行中还有另一个已定义的文本(此处为“交换端口模式访问”),我想匹配以特定字符串开头的行(在此示例中为“ 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

如何使前瞻功能仅在一行不以空格开头的情况下才起作用?

2 个答案:

答案 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)发生

Demo

编辑:感谢Anubhav在评论中提出的建议,以便提供更好的正则表达式,

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

Faster regex as suggested by Anubhava

答案 1 :(得分: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