• Publicidad

Expresión regular que no contiene las subcadenas dadas

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Expresión regular que no contiene las subcadenas dadas

Notapor mudestructor » 2012-10-05 12:49 @576

En cadenas como las siguientes

FNI-II, II, 64: fol. 250v; FNIII, pról.: 3; SS, 1: fol. 3r; FNIV, 42: fol. 49r

quiero colocar "FNI-II" en $1 y ", II, 64: fol. 250v;" en $2.

No sé cómo hacer que el segundo paréntesis no pueda contener ninguna de las subcadenas (AGr|S|AG|FNI-II|FNIII|SS|FNIV|LG|LD).

Forzar que no contenga caracteres es muy sencillo, pero ¿cómo se haría para que no contenga subcadenas?

$x = m/(AGr|S|AG|FNI-II|FNIII|SS|FNIV|LG|LD)([^AGr|S|AG|FNI-II|FNIII|SS|FNIV|LG|LD]*)/;

Gracias por la ayuda.
mudestructor
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2012-10-05 12:44 @572

Publicidad

Re: Expresión regular que no contiene las subcadenas dadas

Notapor explorer » 2012-10-05 13:00 @583

Bienvenido a los foros de Perl en Español, mudestructor.

¿No te valdría con almacenar en $1 el contenido que va desde el comienzo de la cadena hasta la primera coma, y el $2, lo que sigue hasta el siguiente punto y coma?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Expresión regular que no contiene las subcadenas dadas

Notapor mudestructor » 2012-10-05 13:05 @586

Muchas gracias por la bienvenida.

No me sirve, busco la solución a mi pregunta, la línea que he puesto es solo un ejemplo.
mudestructor
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2012-10-05 12:44 @572

Re: Expresión regular que no contiene las subcadenas dadas

Notapor explorer » 2012-10-05 13:30 @604

Bueno, una forma de hacerlo es así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $r = qr/AGr|S|AG|FNI-II|FNIII|SS|FNIV|LG|LD/;
  2. $_ = "FNI-II, II, 64: fol. 250v; FNIII, pról.: 3; SS, 1: fol. 3r; FNIV, 42: fol. 49r";
  3. m/($r) (.+?) \s* (?=$r)/x;
  4. say "[$1|$2]";
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


La idea es capturar todo hasta la próxima aparición del patrón.

Pero hay un problema: qué ocurre si la cadena es

$_ = "FNI-II, II, 64: fol. 250v;";

Es decir, no tenemos contemplado el caso de capturar todo hasta el final del texto.

Con esta variación lo resolvemos:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $r = qr/AGr|S|AG|FNI-II|FNIII|SS|FNIV|LG|LD/;
  2. $_ = "FNI-II, II, 64: fol. 250v; FNIII, pról.: 3; SS, 1: fol. 3r; FNIV, 42: fol. 49r";
  3. m/($r) (.+?) \s* (?:(?=$r)|$)/x;
  4. say "[$1|$2]";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Edito: Ya encontré la manera:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $r = qr/AGr|S|AG|FNI-II|FNIII|SS|FNIV|LG|LD/;
  2. $_ = "FNI-II, II, 64: fol. 250v; FNIII, pról.: 3; SS, 1: fol. 3r; FNIV, 42: fol. 49r";
  3. m/($r)((?:(?! $r).)*)/;
  4. say "[$1|$2]";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

El espacio en blanco que hay delante de $r en la expresión regular es para desechar el espacio que sigue a '250v;'.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Expresión regular que no contiene las subcadenas dadas

Notapor mudestructor » 2012-10-05 16:55 @746

Muchas gracias, soluciona el problema, aunque le he dado muchas vueltas y no he terminado de entender el uso que se hace del interrogante y los dos puntos.
mudestructor
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2012-10-05 12:44 @572

Re: Expresión regular que no contiene las subcadenas dadas

Notapor explorer » 2012-10-05 18:11 @799

La expresión '(?:...)' sirve para agrupar otras expresiones con la ayuda de los paréntesis, pero sin que sean capturadas a $1, $2, $3, etc.

La expresión '(?:(?! $r).)*' quiere decir que buscamos cero o más (*) caracteres (.) que no coincidan con ' $r'. Los paréntesis exteriores agrupan '(?!...)' y '.', para que la comprobación se haga por cada carácter, y se repita para todos los caracteres (el '*' que le sigue).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados