Con las expresiones regulares se pueden sacar fácilmente los patrones, siempre y cuando sepamos las reglas en las que se basan.
Un ejemplo para lo que propones:
Using perl Syntax Highlighting
#!/usr/bin/perl
use warnings
;
use strict
;
my @patrones = (
'ADENO?(?!MA)' ,
'CARCINO?(?!MA)',
'OMA' ,
);
my $malestar = $ARGV[0
] || 'ADENOCARCINOMA';
my @encontrado;
foreach my $patron ( @patrones ) {
if ( $malestar =~ /($patron)/ ) {
push @encontrado, $1;
}
}
print join(" ", @encontrado);
print "\n";Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
Probando:
- Código: Seleccionar todo
explorer@casa:~/> ./vade.pl ADENOCARCINO
ADENO CARCINO
explorer@casa:~/> ./vade.pl ADENOCARCIN
ADENO CARCIN
explorer@casa:~/> ./vade.pl ADENCARCINOMA
ADEN CARCIN OMA
explorer@casa:~/> ./vade.pl ADENOCARCINOMA
ADENO CARCIN OMA
explorer@casa:~/> ./vade.pl ADENOMA
ADEN OMA
En este ejemplo hacemos uso de las expresiones regulares extendidas.
Lo que hace el programa es lo siguiente:
- Creamos un array llamados @patrones en donde guardaremos las expresiones regulares que queremos extraer. En este caso, hemos supuesto que no importa el orden en que vamos a sacar la información.
- Luego leemos el $malestar desde la entrada estándar, como argumento, o le damos uno de prueba.
- Hacemos luego un bucle por todos los @patrones:
- Si dentro de $malestar hay un $patron, entonces, por efecto de los paréntesis, queda guardado en $1.
- y lo guardamos en @encontrado.
- Al final, pintamos el resultado.
El truco está en las expresiones regulares. La expresión
CARCINO?(?!MA) quiere decir: "Busca la palabra
CARCIN, opcionalmente seguida de
O (
O?), PERO que no esté seguida de
MA (
(?!MA))"
Naturalmente, la solución es sencilla porque has puesto un ejemplo sencillo. Como dice kidd, sería interesante ver todo el problema.