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

wha*_*est 1 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
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)

如何使前行仅在行不以空格开头之前起作用?

Pus*_*shi 5

您可以使用这种基于前瞻性的表达式,该表达式仅在其后跟且中间switchport mode accessinterface 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)

如Anubhava建议的更快的正则表达式

  • ++以使其更快地使用:`^ interface GigabitEthernet1 \ / 0 \ / [0-9](?=(?:(?!\ ninterface GigabitEthernet1 \ / 0 \ / [0-9])[\ s \ S])*交换端口模式访问)` (2认同)
  • @anubhava:感谢Anubhav,这是一项体贴的改进,几乎使速度提高了一倍。感谢您为改善我的回答所付出的努力:) (2认同)