Otimizar o regex para conclusão do método PHP

1

Estou trabalhando em uma expressão regular para acionar a conclusão do método de sintaxe php para o deoplete no vim. Existem dois tipos de métodos que precisam ser métodos estáticos completos com os dois-pontos duplos (: :) e métodos de instância com a seta (- >).

[meu] Regras para métodos de instância

  • cifrão
  • Seguido pelo primeiro caractere (Do nome do objeto) é um caractere alfa ou sublinhado
  • Quaisquer caracteres após o primeiro são alfanuméricos ou sublinhados
  • A seta indica o início do nome do método e pode aparecer logo após o nome do objeto ou na próxima linha

Regex, por exemplo, métodos

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

[my] Regras para métodos estáticos

  • Deve começar com um caractere alfa maiúsculo
  • Quaisquer caracteres após o primeiro são alfanuméricos ou sublinhados, alternativamente, a palavra inteira pode ser (auto, pai ou estática)
  • Dois pontos duplos indica o início do nome do método

Métodos estáticos Regex

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

A questão é que posso fazer isso mais rápido, fazendo alguma mágica lookahead ou algo desse tipo, especialmente o método estático regex?

Texto de teste

// Should match
$this
    ->
// Should match
$someObject->
// Should not match
"somethingInAString->"
// Should not match
stdClass::
// Should match
SomeClass::
// Should match
parent::
    
por Mike 20.01.2017 / 21:25

2 respostas

1

Há uma pequena otimização que você pode fazer combinando a primeira letra das duas palavras que começam com s , como

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

mas, na realidade, isso será uma diferença minúscula na velocidade, mas uma diferença maior na legibilidade, então eu não aconselharia isso.

A verdadeira questão é se os seus regexes estão sendo otimizados e compilados pelo deoplete. Eu fiz uma varredura rápida da fonte e não ficou claro para mim se esse é o caso.

Se você permitir que eu saia em um, ...
Geralmente as vantagens dos regexes (particularmente os determinísticos) é que eles podem ser implementados sem <> sem lookhead, transformando-os em um autômato de estado finito leia mais em algum lugar como este ; você processa a entrada de um caractere no momento e faz uma transição para outro estado, com zero backtracking. Se esse método é usado, é muito rápido de qualquer maneira, e as otimizações de mão que você poderia fazer seriam feitas no estágio de transformar o autômato de estado finito não-determinístico em um determinístico.

    
por 21.01.2017 / 00:36
1

esse regex não pode demorar mais do que algumas dezenas de ms. No caso de uso de conclusão que nunca seria o seu gargalo. Algumas maneiras de melhorar o desempenho do vex regexes de qualquer maneira:

\@> , que é um multiuso possessivo \{-} , que é a versão não mesquinha de *

Outra observação interessante, Russ Cox, que escreveu este artigo link , ajudou a criar o regex do vim motor link

    
por 24.01.2017 / 03:05

Tags