1

Я работаю над регулярным выражением для запуска завершения синтаксического метода php для deoplete в vim. Есть два типа методов, которые должны быть заполнены статическими методами с двойным двоеточием (::) и методами экземпляра со стрелкой (->).

[мои] правила для методов экземпляра

  • Знак доллара
  • За ним следует первый символ (названия объекта) - это символ альфа или подчеркивание
  • Любые символы после первого являются буквенно-цифровыми или подчеркиванием
  • Стрелка указывает начало имени метода и может появляться сразу после имени объекта или на следующей строке

Regex для методов экземпляра

\$\([a-zA-Z_][a-zA-Z0-9_]*\)\v?\h?\->

[мои] правила для статических методов

  • Должен начинаться с заглавной буквы
  • Любые символы после первого являются буквенно-цифровыми или символами подчеркивания, в качестве альтернативы может использоваться целое слово (self, parent или static).
  • Двойное двоеточие указывает начало имени метода

Статические методы Regex

\(self|parent|static|[A-Z][a-zA-Z0-9_]*\)::

Вопрос в том, могу ли я сделать это быстрее, используя магию или что-то в этом роде, особенно статический метод regex?

Тестовый текст

// Should match
$this
    ->
// Should match
$someObject->
// Should not match
"somethingInAString->"
// Should not match
stdClass::
// Should match
SomeClass::
// Should match
parent::

2 ответа2

1

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

\@> который является притяжательным мульти \{-} который не является жадной версией *

Также интересное примечание, Русс Кокс, который написал эту статью https://swtch.com/~rsc/regexp/regexp1.html , помог в создании движка регулярных выражений vim https://groups.google.com/forum/#! тема /vim_dev / о-oDH91G8NI

1

Есть небольшая оптимизация, которую вы можете сделать, комбинируя первую букву двух слов, начинающихся с s , например

(s(elf|tatic)|parent|[A-Z][a-zA-Z0-9_]*)::

но на самом деле это будет незначительная разница в скорости, но большая разница в удобочитаемости, поэтому я бы не советовал.

Реальный вопрос заключается в том, оптимизируются ли ваши регулярные выражения и компилируются deoplete. Я быстро просмотрел источник, и мне не было ясно, так ли это.

Если вы позволите мне уйти на один, ....
Как правило, преимущества регулярных выражений (особенно детерминированных) в том, что они могут быть реализованы без предварительного внимания, превратив их в автомат с конечным числом состояний, читая где-то подобное ; Вы обрабатываете ввод символа в то время и делаете переход в другое состояние с нулевым возвратом. Если этот метод используется, он все равно очень быстрый, и ручная оптимизация, которую вы могли бы сделать, была бы сделана на этапе превращения недетерминированного конечного автомата в детерминированный.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .