[Cascavel-pm] Como obrigar uma regex a parar e um determinado local durante a avaliação?

Eden Cardim edencardim em gmail.com
Terça Maio 30 14:14:58 PDT 2006


Saudações!
Não sei se a pergunta está bem feita, vou tentar explicar com mais
detalhes. O problema é o seguinte:
Eu tenho uma string contendo números inteiros separados por espaço.
Quero uma expressão regular para percorrer a string, capturando os
números um por um, comparando-os com um determinado parâmetro
numérico, quero encerrar o reconhecimento da regex quando o último
dígito reconhecido for menor que o parâmetro. Eu consegui armengar uma
regex horrenda pra fazer isso:

my $limit = 10;
my $string = q/9 10 20 32 43 8 5 30 31/;
$string =~ /(?:(\d+)(?(?{$1 < $limit})\S|\s))+/;
print $&; #saída: '10 20 32 43'

Isso só funciona porque sei que todos os dígitos são seguidos de
espaço e obrigo a regex a parar obrigando casamento com \S se a
condição for satisfeita. Só que agora preciso fazer algo similar e
dessa vez não tenho ajuda da string de entrada. Quero que a expressão
regular case com a maior substring possível tal que essa string tenha
90% (ou uma outra porcentagem qualquer) de um determinado caracter
dentro dela. No caso:

'XXXXXAXXXX'
'XXXBXXXXXBBXXXXXXXXX'
...são reconhecidas e...
'XXXAAXXXXXBBXXXXXXXXX'
reconhece a substring 'XXXXXBBXXXXXXXXX'

Tem alguma forma de fazer isso com regex?
Quero usar regexes por dois motivos: quero aproveitar a velocidade das
regexes do perl, porque sei que qualquer outra coisa que eu mesmo
implementar vai ficar mais lento (vou processar strings de até 1 GB).
Além disso, estou com preguiça de elaborar um algorítmo com desempenho
aceitável. :P
Se houver uma outra alternativa, módulo, etc, que faça isso...
agradeço antecipadamente as sugestões.


Mais detalhes sobre a lista de discussão Cascavel-pm