Соответствие конструкции объекта в исходных файлах с использованием регулярных выражений - PullRequest
0 голосов
/ 06 декабря 2018

Я порядочен с шаблонами регулярных выражений.Но сегодня я наткнулся на попытку создать шаблон, соответствующий конструкции объекта, например "new Class(..)" в типичных исходных файлах C ++.К сожалению, оператор new в C ++ имеет многократное использование.Например, я пытаюсь сопоставить его в следующем тексте

// This is the new connection object which does xyz and abc
 Connection = new (xbt->length 
                     + sizeof(PVOID))
                  CCONECTION("ipaddress");

Шаблон регулярного выражения: (?<=new)(?s).*?CCONECTION

Приведенный выше шаблон не соответствует

new (xbt->length 
^^^   
      + sizeof(PVOID))
       CCONECTION("ipaddress");
              ^^^

Вместо этого это соответствует

    new connection object which does xyz and abc
    ^^^
 Connection = new (xbt->length 
                     + sizeof(PVOID))
                  CCONECTION("ipaddress");
                         ^^^

Есть ли способ, которым я могу жадно смотреть назад только на ближайшее «новое» слово перед CCONECTION?Я попробовал несколько вариантов просмотра, но не смог заставить его работать.

Я использую ripgrep с его поддержкой нескольких строк (-U), чтобы сопоставить приведенное выше регулярное выражение как rg -U "(?<=new)(?s).*?CCONECTION" --pcre2 -g a.txt

1 Ответ

0 голосов
/ 06 декабря 2018

Вам нужен негативный взгляд вперед, чтобы гарантировать, что new не появится в запланированном захваченном матче.Вы должны использовать это регулярное выражение,

(?<=new)(?s)(?!.*new).*?CCONECTION

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...