Use a antecipação negativa e .
:
perl -pe '/^((?:(?!BA).)*?B(?:A(?:(?!BA).)*?B){30})A/'
Não é muito bonito, mas funciona.
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.
Tags perl regular-expression