Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906

    [Espressioni regolari] Cercare stringa che NON corrisponda con un dato pattern

    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.

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    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
    codice:
    ([^<]*(<[^<])?)*
    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.

  3. #3
    No, scusa, ma nel tuo linguaggio non è possibile negare la condizione ?
    In perl ad esempio:
    codice:
    if(a !~ /pattern/)
    in PHP:
    codice:
    if(!preg(pattern))
    ?


  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    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'.

  5. #5
    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.

  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    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.
    codice:
    !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.

  7. #7
    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.
    codice:
    !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.

  8. #8
    Ciao,

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


Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.