Sí, yo creo que podría funcionar, pero habría que hacer pruebas.
Por ejemplo, la condición {0,20}, hay que vigilarla... Miremos el siguiente ejemplo:
Using perl Syntax Highlighting
#!/usr/bin/perl
use common::sense;
use open ':locale';
# texto a analizar
my $texto
= 'En un lugar de la Mancha, de cuyo nombre no quiero acordarme, no ha mucho '
. 'tiempo que vivía un hidalgo de los de lanza en astillero, adarga antigua, '
. 'rocín flaco y galgo corredor. Una olla de algo más vaca que carnero, salpicón '
. 'las más noches, duelos y quebrantos los sábados, lentejas los viernes, algún '
. 'palomino de añadidura los domingos, consumían las tres partes de su hacienda. '
. 'El resto della concluían sayo de velarte, calzas de velludo para las fiestas '
. 'con sus pantuflos de lo mismo, los días de entre semana se honraba con su '
. 'vellori de lo más fino. Tenía en su casa una ama que pasaba de los cuarenta, y '
. 'una sobrina que no llegaba a los veinte, y un mozo de campo y plaza, que así '
. 'ensillaba el rocín como tomaba la podadera. Frisaba la edad de nuestro hidalgo '
. 'con los cincuenta años, era de complexión recia, seco de carnes, enjuto de '
. 'rostro; gran madrugador y amigo de la caza. Quieren decir que tenía el '
. 'sobrenombre de Quijada o Quesada (que en esto hay alguna diferencia en los '
. 'autores que deste caso escriben), aunque por conjeturas verosímiles se deja '
. 'entender que se llama Quijana; pero esto importa poco a nuestro cuento; basta '
. 'que en la narración dél no se salga un punto de la verdad.'
;
my @frases;
while ($texto =~ /\G (?<frase>.+? [.!?]) \s*/gx) {
my $frase = $+{'frase'};
$frase =~ s/\W+/ /g; # quitamos los caracteres ortográficos
push @frases, $frase;
}
# análisis
my $str_1 = 'un';
my $str_2 = 'de';
for my $frase (@frases) {
say "[$frase]\n";
while ($frase =~ /(\b $str_1 (?:\W+ \w+ ){0,20} \W+ $str_2 \b)/gx) {
say "\t[$1]";
}
say;
}
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
Con este código buscamos conjuntos de hasta 20 palabras que estén entre la palabra 'un' y la palabra 'de (las opciones
\b son significativas, para impedir que 'un' y 'de' formen parte, respectivamente, del final y del principio de otras palabras).
El resultado es:
Using text Syntax Highlighting
[En un lugar de la Mancha de cuyo nombre no quiero acordarme no ha mucho tiempo que vivía un hidalgo de los de lanza en astillero adarga antigua rocín flaco y galgo corredor ]
[un lugar de la Mancha de cuyo nombre no quiero acordarme no ha mucho tiempo que vivía un hidalgo de los de]
(sigue más)
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
Observamos que ha encontrado una correspondencia de justo esa cantidad de palabras, pero, si nos fijamos bien, resulta que podría haber cortado la frase mucho antes.
Si cambiamos
{0,20} por
{0,20}?, indicamos que queremos quedarnos con la menor cantidad posible de palabras. Ejecutamos y sale:
Using text Syntax Highlighting
[En un lugar de la Mancha de cuyo nombre no quiero acordarme no ha mucho tiempo que vivía un hidalgo de los de lanza en astillero adarga antigua rocín flaco y galgo corredor ]
[un lugar de]
[un hidalgo de]
Coloreado en 0.000 segundos, usando
GeSHi 1.0.8.4
Ahora ha encontrado dos secuencias en sólo la primera frase, cuando antes solo encontró una sola.
Depende de lo que estés buscando, tendrás que adoptar una estrategia u otra.