PDA

Visualizza la versione completa : [Espressioni regolari] Cercare stringa che NON corrisponda con un dato pattern


simo7784
21-06-2008, 02:33
Ciao a tutti,
avrei un problema con le espressioni regolari; ho una stringa contenente del testo e mi servirebbe un'espressione regolare che corrisponda con tutte le sequenze di caratteri che NON rispettano un dato pattern. Ho fatto delle prove ma non riesco a venirne a capo(ho iniziato stasera con le espressioni regolari), qualcuno mi potrebbe indicare delle regole per trasformare analiticamente un'espressione regolare nella sua negazione. Lo scenario e' circa questo:
"<<aaa>>assdaad<<ghgh>>qwqw<<xxx>>"
vorrei capire come ricavare un espressione che matchi con tutto quello che non abbia la forma <<(.)*?>> cioè, nel'esempio sopra [assdaad,qwqw].
Spero di essermi spiegato, grazie in anticipo per l'eventuale aiuto.

simo7784
21-06-2008, 13:07
Credo di essere arrivato ad una prima soluzione cambiando approccio. Praticamente mi sono definito la grammatica regolare che codifica il pattern inverso e l'ho trasformata in un espressione regolare (il procedimento si trova su internet in molte pagine di corsi universitari, basta usare un motore di ricerca). Sono arrivato a questo risultato

([^<]*(<[^<])?)*
che per ora sembra funzionare abbastanza bene. In questo modo finché trova un carattere che non sia '<' va avanti grazie a [^<]* (potenzialmente fino alla fine se non trova '<'), se trova '<' controlla che il carattere successivo non sia '<', in caso affermativo ricomincia a consumare caratteri finchè non trova '<', se lo trova esegue il controllo e così via. L'unico problema e' che mi taglia l'ultimo carattere se la stringa finisce con una sequenza di caratteri "buona" terminata da un '<', piu' avanti cerchero' di risolvere il bug (Non posso mettere <? alla fine perche mi consumerebbe il primo carattere di un ipotetico << rovinando i risultati) e per ora mi accontento.

menphisx
21-06-2008, 16:31
No, scusa, ma nel tuo linguaggio non è possibile negare la condizione ?
In perl ad esempio:


if(a !~ /pattern/)

in PHP:


if(!preg(pattern))


?

:ciauz:

simo7784
21-06-2008, 17:00
Non lo so, ho iniziato da poco con le regexp.
Lo sto provando con java, classe Matcher, perche' lo uso da piu' tempo, ma il linguaggio non e' vincolante. Ho una cosa da chiederti sulla tua soluzione. Per quanto riguarda il php ho trovato la funzione preg_match, ma non la funzione preg; in ogni caso non capisco dove gli specifico la stringa in cui ricercare le sottostringhe che non rispettino il pattern e nutro anche dei dubbi sul fatto che negando un'espressione regolare con l'operatore del linguaggio, possa ottenere il risultato desiderato. Se puoi fornirmi ulteriori dettagli, magari anche un'esempio pratico semplice, in qualunque linguaggio, te ne sarei grato. Intanto grazie per la disponibilita'.

menphisx
21-06-2008, 17:16
Si ho sbagliato non era preg, ma preg_match ...
Comunque se la funzione di matching ritorna vero in caso un pattern corrisponda ad una stringa; allora per estrarre tutto tranne ciò che corrisponde al pattern basterà negare il risultato.

simo7784
21-06-2008, 17:36
Mmmh... Il risultato di preg_match e' un intero che indica il numero di sottostringhe compatibili con il pattern, per accedere alle sottostringhe bisogna passargli un array che la funzione popolera'. Ok, fin qui ci sono, ma non mi torna una cosa.

!preg(pattern,testo,array)
L'array viene popolato dalla funzione prima che venga considerata la negazione.
La negazione in questo modo non agische sul valore di ritorno (cioe' l'intero)?
Non credo che sia quello che stavo cercando, io ho bisogno che nell'array ci vadano le sottostringhe che non rispettano il pattern.

P.s. L'espressione regolare che avevo postato sopra in effetti non va. L'avevo provata insieme alla sua complementare e fin li' tutto ok, da sola pero' mi restituisce anche i pezzi tra << >> ovviamente senza il primo carattere < che genererebbe una collisione con il pattern.

menphisx
21-06-2008, 17:46
Originariamente inviato da simo7784
Mmmh... Il risultato di preg_match e' un intero che indica il numero di sottostringhe compatibili con il pattern, per accedere alle sottostringhe bisogna passargli un array che la funzione popolera'. Ok, fin qui ci sono, ma non mi torna una cosa.

!preg(pattern,testo,array)
L'array viene popolato dalla funzione prima che venga considerata la negazione.
La negazione in questo modo non agische sul valore di ritorno (cioe' l'intero)?
Non credo che sia quello che stavo cercando, io ho bisogno che nell'array ci vadano le sottostringhe che non rispettano il pattern.


Si probabilmente hai ragione.
Ma non conosco altro modo, altrettanto semplice, per negare una espressione regolare.

Vincenzo1968
22-06-2008, 18:50
Ciao,



(?<=[>])(\w)*(?=[<])


La parte (?<=[<]) trova tutte le stringhe precedute dal segno '>'.
La parte (?=[<]) trova le stringhe seguite dal segno '<'.

:)

Loading