Regex Lookahead для соответствия на основе текста с отступом - PullRequest
1 голос
/ 19 марта 2019

Я хочу сопоставить строки, начинающиеся с определенной строки (в данном примере «interface»), если в следующих строках с отступом есть другой определенный текст (здесь «доступ в режиме switchport»).

Пример данных:

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

Как сделать так, чтобы lookahead работал только до тех пор, пока не появится строка, которая не начинается с пробела?

Ответы [ 2 ]

4 голосов
/ 19 марта 2019

Вы можете использовать это выражение, основанное на прогнозировании, которое будет соответствовать вашей желаемой строке, только если за ней следует 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) положительный взгляд вперед

Демо

Редактировать: Благодаря предложению Анубхава в комментариях о еще более эффективном регулярном выражении,

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

Более быстрое регулярное выражение в соответствии с предложением Анубхавы

3 голосов
/ 19 марта 2019

Захват содержимого группы 1 после использования следующего регулярного выражения:

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

Нажмите для демонстрации

Объяснение:

  • (interface GigabitEthernet.*) - Закаленный жадный жетон - соответствует interface GigabitEthernet, за которым следует 0+ вхождений любого символа до символа новой строки и захватывает символвсе это совпадение в группе 1
  • (?:(?!interface GigabitEthernet)[\s\S])* - соответствует 0+ вхождений любого символа, который не начинается с подстроки interface GigabitEthernet
  • switchport mode access - соответствует switchport mode access
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...