giovedì 11 novembre 2010

Espressamente per voi le Espressioni regolari for dummy


Se a voi le espressioni regolari potrebbero apparire un gergo per definire quei dialoghi nati per essere detti ma non per essere ascoltati: “Ehi, come va?” “Non c'è male, e tu?”, forse dovreste rivedere la vostra definizione quando avrete difronte un Programmatore che vi annienta con lo sguardo mentre vi dice, con tono astioso, che quelle sono scialbe ciance routinarie.



Per farvi comprendere l'astio del Programmatore nei vostri confronti, pensate all'armonia che percepite quando potete dire “ho l'intestino regolare” e adesso, dopo esser entrati in questo stato armonioso, pensate alla sensazione di potenza che cogliete dall'espressione dell'interlocutore dopo avergli detto “Ho fatto il passo dello Stelvio in bicicletta”, ebbene se sommate le due sensazioni potreste avere una vaga idea del pathos che vive il Programmatore nei confronti delle espressioni regolari e del suo odio nei vostri riguardi per il fatto che non partecipiate alla stessa emozione e idolatria su tanta magnificenza.

Già, il Programmatore quando sente l'espressione espressioni regolari inevitabilmente ed estasiaticamente vede scorrere davanti agli occhi il superlativo potere di stringhe parimenti a questa:
'/^[^0-9][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[@][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)*[.][a-zA-Z]{2,4}$/'
fonte


Come avrete capito dalla stringa sopra citata, le espressioni regolari rappresentano il più potente e veloce modo per fare un'analisi lessicale di un testo.


Se a questo punto siete ancora nell'oblio del che sta a dì??? evidentemente non avete minimamente colto l'opportunità di poter lavorare meno ...e meglio (ma quest'ultimo aspetto forse interessa a molti meno).


La fatica ai muli

Vi sarà sicuramente capitato di soffrire per un vostro collega, o per voi stessi, quando lo vedete ridotto a un mulo automa, ad esempio, mentre corregge manualmente la punteggiatura di un elenco con centinaia di voci.

Non so a voi, ma a me capita spesso di dover correggere la punteggiatura errata dei punti elenco (ma io non soffro), già perché sovente gli autori dimenticano che un punto elenco dovrebbe avere un'adeguata punteggiatura: ogni voce termina con il punto e virgola tranne l'ultima che termina con il punto.


Un esempio per tutti
Moltissimi editor di testi offrono appunto l'utilizzo delle espressioni regolari, ad esempio se con Writer di OpenOffice dobbiamo provvedere a inserire la punteggiatura dimenticata (il punto e virgola alla fine della voce) in un mastodontico elenco, invece di chinare la testa e digitare a mo' di uomo robotizzato i punti e virgola per ogni voce per le prossime ore possiamo semplicemente e velocemente selezionare l'intero elenco, tranne l'ultima voce (dove metterete il punto), e dal menu Modifica scegliere il comando Cerca e sostituisci.
Nella finestra che comparirà dovrete cliccare sul pulsante in basso Altre Opzioni e mettere il segno di spunta a:
  • Solo nella selezione;
  • Espressione regolare.

Adesso, avendo abilitato le espressioni regolari, potete sbizzarrirvi con le regole di analisi lessicale.
Nel nostro caso, nel campo Cerca avremo la necessità di dirgli di cercare ogni fine riga, per fare ciò digiteremo semplicemente il carattere $ che sta a indicare la fine riga.
Poi, nel campo Sostituisci con, dovremo dirgli di mettere il punto e virgola, ma, importante, dobbiamo anche dirgli di non rimuovere la fine riga, pertanto digiteremo la seguente combinazione di caratteri:
;\n
dove ; è il carattere che verrà inserito (sostituisce) a ciascuna fine riga, e i caratteri \n specificano di mantenere (o rimettere) la fine riga in modo da mantenere la struttura verticale dell'elenco (altrimenti ci ritroveremmo tutte le voci in un'unica riga orizzontale).





E se...

E se l'autore pivello di turno del testo da correggere avesse inserito manualmente la numerazione davanti alla voce del punto elenco, come rimuoverla per lasciare (o inserire) unicamente la formattazione a punto elenco dell'editor?
Semplice: usando le espressioni regolari!

Compiendo le operazione poc'anzi menzionate, nel campo Cerca scriveremo:
^[:digit:].
Mentre il campo Sostituisci con lo lasceremo vuoto.
Ehi, non dimenticarti infine di cliccare sul pulsante Sostituisci tutto!!

Take It Easy

Quando la pigrizia ti impedisce di leggerti l'help

Ti riporto la pagina di OpenOffice che spiega i caratteri usati per scrivere le espressioni regolari in Writer (ma impara a leggerti gli help):

Carattere
Effetto/uso
Qualsiasi carattereRappresenta il carattere dato se non diversamente specificato.
..Rappresenta qualsiasi carattere singolo, ad eccezione dei caratteri di interruzione riga o interruzione di paragrafo. Ad esempio, la ricerca di "R.ssi" restituisce sia "Rossi" che "Russi".
^Trova il termine ricercato solo se appare all'inizio di un paragrafo. Eventuali oggetti speciali (come campi vuoti o cornici ancorate a caratteri) all'inizio di un paragrafo vengono ignorati. Esempio: "^Mario".
$Trova il termine ricercato solo se appare alla fine di un paragrafo. Eventuali oggetti speciali (come campi vuoti o cornici ancorate a caratteri) alla fine di un paragrafo vengono ignorati. Esempio: "Mario$".
*Identifica l'assenza o la presenza di uno o più dei caratteri che precedono "*". Ad esempio, "Ab*c" trova "Ac", "Abc", "Abbc", "Abbbc" e così via.
+Identifica uno o più caratteri che precedono "+". Ad esempio, "AX.+4" trova "AXx4", ma non "AX4".
Viene sempre trovata la stringa più lunga corrispondente al modello di ricerca in un paragrafo. Se il paragrafo contiene la stringa "AX 4 AX4", viene evidenziato l'intero passaggio.
?Identifica l'assenza o una singola occorrenza dei caratteri che precedono "?". Ad esempio, "Testi?" restituisce "Test" e "Testi", mentre "x(ab|c)?y" restituisce "xy", "xaby" o "xcy".
\La ricerca interpreta il carattere speciale che segue "\" come un carattere normale e non come un'espressione regolare (ad eccezione delle combinazioni \n, \t, \> e \<). Ad esempio, "figli\." trova "figli.", non "figlio" o "figlia".
\nRappresenta un'interruzione di riga inserita con la combinazione di tasti Maiusc+Invio. Per trasformare l'interruzione di riga in un'interruzione di paragrafo, inserite \n nelle caselle Cerca e Sostituisci con, quindi eseguite un'operazione di ricerca e sostituzione.
\n nella casella di testo Cerca rappresenta un'interruzione di riga inserita con la combinazione di tasti Maiusc+Invio.
\n nella casella di testo Sostituisci con rappresenta un'interruzione di paragrafo che può essere inserita col tasto Invio.
\tRappresenta una tabulazione. Potete utilizzare questa espressione anche nella casella Sostituisci con.
\>Trova il termine ricercato solo se appare alla fine di una parola. Ad esempio, "ami\>" trova "rami", ma non "amici".
\<Trova il termine ricercato solo se appare all'inizio di una parola. Ad esempio, "\<ami" trova "amici", ma non "rami".
^$Individua un paragrafo vuoto.
^.Ricerca il primo carattere di un paragrafo.
& o $0Quando effettuate una sostituzione, aggiunge la stringa individuata dai criteri di ricerca della casella Cerca al termine che compare nella casella Sostituisci con.
Ad esempio, se inserite "cornice" nella casella Cerca e "&finestra" nella casella Sostituisci con, la parola "cornice" viene sostituita con "cornicefinestra".
Immettendo il carattere "&" nella casella Sostituisci con potete modificare gli Attributi o il Formato della stringa individuata dai criteri di ricerca.
[abc123]Rappresenta uno dei caratteri compresi tra parentesi.
[a-e]Rappresenta i caratteri compresi tra le lettere "a" ed "e".
[a-eh-x]Rappresenta i caratteri compresi tra le lettere "a" ed "e" e tra le lettere "h" e "x".
[^a-s]Rappresenta i caratteri non compresi tra "a" e "s".
\xXXXXRappresenta un carattere speciale in base al relativo codice esadecimale a quattro cifre (XXXX).
Il codice per il carattere speciale dipende dal tipo di carattere utilizzato. Per visualizzare i codici, scegliete Inserisci - Carattere speciale.
questo|quelloTrova i termini che compaiono prima e dopo "|". Ad esempio, il criterio "questo|quello" trova sia "questo" che "quello".
{2}Definisce il numero di ripetizioni del carattere che precede la parentesi graffa aperta. Ad esempio, "mol{2}e" trova "molle".
{1,2}Definisce quante volte può ripetersi il carattere che precede la parentesi graffa aperta. Ad esempio, "mol{1,2}e" trova "mole" e "molle".
{1,}Definisce il numero minimo di volte che il carattere che precede la parentesi graffa aperta può ripetersi. Ad esempio, "mol{2}e" trova "molle", "mollle" e "mollllle".
( )Nella casella Cerca:
Definisce i caratteri tra parentesi come riferimento. Potete quindi fare riferimento al primo riferimento nell'espressione attiva con "\1", al secondo con "\2" e così via.
Ad esempio, se il vostro testo contiene il numero 13487889 ed eseguite una ricerca utilizzando l'espressione regolare (8)7\1\1, viene trovato "8788".
Per raggruppare i termini potete utilizzare anche (), ad esempio, "a(bc)?d" trova "ad" o "abcd".
Nella casella Sostituisci con:
Usate il simbolo $ (dollaro) anziché \ (doppia barra rovesciata) per sostituire riferimenti. Usate $0 per sostituire l'intera stringa trovata.
[:alpha:]Rappresenta un carattere alfabetico. Per cercarne uno usate [:alpha:]+.
[:digit:]Rappresenta una cifra decimale. Per cercarne una usate [:digit:]+.
[:alnum:]Rappresenta un carattere alfanumerico ([:alpha:] e [:digit:]).
[:space:]Rappresenta un carattere di spazio singolo (ma non altri caratteri di spaziatura).
[:print:]Rappresenta qualsiasi carattere stampabile.
[:cntrl:]Rappresenta qualsiasi carattere non stampabile.
[:lower:]Rappresenta un carattere minuscolo se avete selezionato Ricerca esatta nell'area Opzioni.
[:upper:]Rappresenta un carattere maiuscolo se avete selezionato Ricerca esatta nell'area Opzioni.

Nessun commento:

Posta un commento