Отрицательный взгляд за задним числом - PullRequest
0 голосов
/ 23 апреля 2020

Мне нужно провести рефакторинг некоторых PHP аннотаций, я хочу заменить string[] на array<int, string>.

Я попытался сопоставить соответствующие аннотации с этим регулярным выражением PCRE:

(?<!\$|>)\w+\[\]

Но это не работает, вот как регулярное выражение соответствует :

Regex 101 preview

Две последние строки не должны не совпадают Есть ли способ создать рабочее регулярное выражение для этого, или я должен использовать создать собственный сценарий для этого?

1 Ответ

1 голос
/ 23 апреля 2020

Вы можете использовать

\b(?<!\$|->)\w+\[]

См. Демонстрационный пример PCRE .

Подробности

  • \b - граница слова
  • (?<!\$|->) - отрицательный взгляд сзади, который не соответствует совпадению, если слева от текущего местоположения есть $ или ->
  • \w+ - 1+ слова.
  • \[] - подстрока [].

См. PHP demo :

$str = '/** @var string[] */
/** @return string[] */
* @param Company[]|null $companies

$icons[] = static::getIconDetailsFromLink($link);
$this->properties[] = $property;';

if (preg_match_all('/\b(?<!\$|->)\w+\[]/', $str, $matches)) {
  print_r($matches);
}
...