繁体   English   中英

Regex Lookahead 根据缩进文本进行匹配

[英]Regex Lookahead to match based on indented text

如果在以下缩进行中有另一个定义的文本(此处为“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)[\\w\\W])*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)

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

使用以下正则表达式后捕获 Group 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM