Регулярное выражение для соответствия строке вне класса или функционального блока - PullRequest
0 голосов
/ 07 февраля 2020

Вот сокращенный регистр PHP код:

use Package;
use Package2;

class {
    use Trait;

    function fn() {
       function() use ($var) {

       }
    }
}

Я бы хотел сопоставить только use до Package; и Package2; , а не use Trait ни use ($var)

Ничто, вроде негативного взгляда и негативного взгляда сзади, не работает. Опробовал этот подход Регулярное выражение, сопоставление символов вне фигурных скобок {}

Очевидно, не работает: https://regex101.com/r/L6N4Ye/1

Использование интерпретатора PCRE .

Ответы [ 2 ]

1 голос
/ 07 февраля 2020

Хотя использование регулярных выражений может быть не лучшим выбором здесь. Вы можете использовать один, если у вас есть контроль над форматом кода, который вы анализируете. В противном случае, лучше использовать парсер PHP.

Имея это в виду, как насчет проверки, находится ли use в начале строки (^)?

^use\s+(?![^{]*\})

см. Здесь

0 голосов
/ 07 февраля 2020

Мне не известен синтаксис PHP, поэтому, пожалуйста, прости меня за пропущенные синтаксические соображения.

Поскольку в данном конкретном случае вы уверены, что все use s вас интересуют l ie до границы класса, я думаю, что может помочь поиск всех use, которым не предшествует {, что может быть достигнуто с помощью следующего регулярного выражения, использующего отрицательный взгляд за {:

(?<!\{\s{0,100})\s*use\s*(?<pkg>.*);

После применения этого ко всему исходному коду, вы можете искать группы с именем pkg в соответствующих подстроках.

Однако, это не так Хорошая роль в негативном взгляде сзади - \s{0,100}, который я включил только для того, чтобы после пробела открывать пробелы. Должен быть лучший способ для этого. Я должен был сделать это, потому что отрицательные взгляды нуждаются в вычисляемой максимальной длине, из-за которой \\s* не будет работать.

Мои предположения о синтаксисе:

  1. use всегда small case
  2. Оператор пакета use оканчивается на ; обязательно
  3. Пробелы допускаются свободно между токенами, как в случае Java
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...