Bienvenido a los foros de Perl en Español, jrblas.
No sé si entiendo lo que quieres hacer, pero entre la reglas de las expresiones regulares no existe el concepto de 'excepción' a la regla. Bueno, sí, pero esa excepción debe formar parte, a su vez, de una regla.
Por lo que veo, quieres que identifique palabras compuestas de tres primeras letras cualesquiera, seguida de otras tres letras en las que, necesariamente, debe haber una 'F'.
Eso se puede hacer con lo siguiente:
Using perl Syntax Highlighting
#!/usr/bin/perl
my @palabras = qw(
AQUSOF 1QUSOF A1USOF AQ1SOF AQ1FOL
AQUSOL BARNEY FREDER
AQUSOF BARNFY FREFER 1REDER
);
for my $palabra (@palabras) {
print "[$palabra] : ";
my $encontrada =
$palabra =~ m/^.{3}(.{3})$/;
my $segunda_parte = $1;
if ($encontrada and $segunda_parte =~ /F/) {
print "si\n";
}
else {
print "no\n";
}
}
__END__
[AQUSOF] : si
[1QUSOF] : si
[A1USOF] : si
[AQ1SOF] : si
[AQ1FOL] : si
[AQUSOL] : no
[BARNEY] : no
[FREDER] : no
[AQUSOF] : si
[BARNFY] : si
[FREFER] : si
[1REDER] : no
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
Esta es otra versión un poco más compacta. Usamos una aserción consiguiente para que compruebe que lo que sigue al primer bloque de tres letras, son otras tres, y nada más. Y luego comprobamos que en esas tres letras al menos exista una 'F':
Using perl Syntax Highlighting
#!/usr/bin/perl
my @palabras = qw(
AQUSOF 1QUSOF A1USOF AQ1SOF AQ1FOL
AQUSOL BARNEY FREDER
AQUSOF BARNFY FREFER 1REDER
XXXXFXX
);
for my $palabra (@palabras) {
print "[$palabra] : ";
my $encontrada = $palabra =~ m/^.{3}(?=.{3}$).*F{1,3}.*$/;
if ($encontrada) {
print "si\n";
}
else {
print "no\n";
}
}
__END__
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
(La palabra XXXXFXX está para verificar que, efectivamente, descarta aquellas palabras de más de 6 letras, aunque tengan una 'F'.)
No sé si es esto lo que buscas...
Más información en
perldoc perlre (
traducido).