Regexp: regexp horrivelmente lento em perl - como otimizar?

0

Isto:

echo BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BBBBBBBBBBBBBBBBBBBBBBBBBBBBA |
  perl -pe '/^(.*?B(?:A.*?B){30})A/'

leva surpreendentes 8 segundos na minha máquina. Eu esperava que levasse no máximo algumas ms.

Isso leva < 10 ms:

echo BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BA BBBBBBBBBBBBBBBBBBBBBBBBBBBBA |
   perl -pe '/^(.*?B(?:A.*?B){30})A/'

Como posso fazer a primeira coisa mais rápida?

Eu precisarei de A e B para serem expressões regulares, ou seja, elas não serão simplesmente letras únicas.

    
por Ole Tange 23.04.2018 / 01:58

1 resposta

1

Use a antecipação negativa e . :

perl -pe '/^((?:(?!BA).)*?B(?:A(?:(?!BA).)*?B){30})A/'

Não é muito bonito, mas funciona.

    
por 23.04.2018 / 02:15