| Autore: IRon | Data: 2005-09-01 |
| Modificato:
Documento non modificato
|
Letture: 4120 |
|
Le Regular Expressions, chiamate anche regex, sono un insieme di regole utili per la creazione di modelli di ricerca e di modifica di dati. Il loro utilizzo ci permette di risparmiare in termini di codice, infatti possiamo ridurre una lunga serie di condizioni a un'unica regex rendendo il codice più comprensibile! Nell'help del mIRC non troviamo molto a riguardo, infatti vengono indicati solamente gli identificatori e le loro funzioni, ma sull' utilità e su come creare una regex non veongono fornite informazioni.. L'help del mIRC esordisce così : " Regular expressions are basically a grammar that can be used to perfom complicated pattern matching operations. You should already know how to use Regular expressions before using the identifiers below. It is beyond the scope of this help file to explain how Regular Expressions work. There are many websites on the internet that introduce regular expressions and provide examples. "
Seguendo il consiglio di Khaled e girando un pò sul web ho cercato di capire la sintassi delle regular expressions applicandola poi al mircscripting. In ogni caso prima di parlare della sintassi, vediamo come mIRC tratta le regex e quali sono gli identificatori che supporta. $regex([name], text, re) Restituisce il numero di stringhe confrontate con la regex. $regex(prot,IRon,on$) restituisce uno
E' importante ricordare che le regex sono case sensitive, cioè considerano diverse le maiuscole dalle minuscole, quindi : $regex(IRon saluta tutti,^IR) che restituisce 1 sarà diverso da: $regex(IRon saluta tutti,^ir) che restituisce 0 Da notare che in questo caso abbiamo omesso il nome, infatti mIRC ci consente di fare ciò e assegna un nome di default che sarà sovrascritto ad ogni chiamata. D'ora in avanti ometteremo sempre il nome. - $regml([name], N) Fornisce un valore in seguito a una chiamata di $regex() e restituisce la stringa trovata. Se N = 0 , restituisce il numero totale di stringhe trovate. //echo -a $regex(IRon saluta tutti,(saluta|mangia)) - $regml(0) - $regml(1) - $regml(1).pos La proprietà .pos ci dice la posizione all'interno del testo della stringa trovata. - $regsub([name], text, re, subtext, %var) Stessa funzione di $regex(), con la possibilità di effettuare una sostituzione mediante il subtext. Restituisce N, il numero delle sostituzioni eseguite e salva il risultato in %var. //echo -a $regsub(IRon saluta tutti,on,oFF, %i) - %i
- Una volta chiarite le funzioni degli identificatori, passiamo a spiegare in che modo costruire una regex : per fare ciò è necessario introdurre alcuni operatori. Naturalmente chi conosce già le regex e le ha utilizzate in altri linguaggi di programmazione sarà facilitato nella comprensione, tuttavia cercherò di essere più chiaro e preciso possibile affinchè anche coloro che affrontino per la prima volta l'argomento regex riescano facilmente ad afferrare i concetti.. Per facilitare la comprensione dividiamo gli operatori in due gruppi : operatori qualitativi e operatori quantitativi. - - OPERATORI QUALITATIVI: ^ : substringa all'inizio della stringa Poniamo l'esempio di avere ^pane Il matching avrà esito positivo solo se pane si troverà nelle prime 4 posizioni della stringa : panettone <- esito positivo campane <- esito negativo Vediamo alcuni esempi : $regex(mirc,^mi) Restituisce un valore booleano, in questo caso 1 corrispondente a TRUE $regex(mirc,^r) Restituisce 0 in quanto la substringa non viene trovata all'inizio del testo. - $ : substringa alla fine della stringa E' l'esatto opposto dell'operatore precedente, infatti dà esito positivo solo se la substringa si trova alla fine della stringa.. $regex(tutorial regex,gex$) Restituisce 1 Cambiando la fine della stringa otterremo 0 : $regex(tutorial regex scritto da IRon,gex$) Restituisce 0 Gli operatori ^ e $ possono essere anche utilizzati insieme per cercare una substringa che risulti uguale alla stringa : $regex(Insane,^Insane$) Ritorna 1 se c'è una corrispondenza, altrimenti, come abbiamo avuto modo di vedere negli altri casi, ritorna 0. - (...) : gruppo di substringhe $regex(IRon is the best,(is|was|will be)) Restituisce 1 se la ricerca di almeno una delle tre substringhe indicate ha esito positivo, infatti avviene un confronto con la prima parte del pattern, se questa non viene trovata prova a cercare la seconda quindi la terza.. Attraverso le parentesi possiamo unire parti di espressione e creare patterns più complessi, in questo esempio notiamo che attraverso l'operatore di alternanza | (che corrisponde a or) è stato possibile allargare il matching a più di una substringa con un risparmio notevole di codice. - [...] : classe di caratteri All'interno delle quadre và indicata la classe di caratteri a cui deve appartenere la sottostringa. [0-9] Numeri [A-Z] Lettere dell'alfabeto (maiuscole) [a-z] Lettere dell'alfabeto (minuscole) (ricordiamo le regex sono case sensitive quindi occorreva elencare entrambe le classi) $regex(44 gatti,[0-6]) Matching positivo, restituisce 1 in quanto 4 rientra nella classe [0-6] $regex(tutorial by IRon,[a-f]$) Matching negativo, restituisce 0 in quanto la stringa dovrebbe terminare con una lettera minuscola appartenente alla classe [a-f], invece termina per n. - . (punto) : carattere qualsiasi Supponiamo di avere il pattern .alice Un matching di esso darà esito positivo solo se all'interno della stringa in cui si effettua la ricerca sia presente ad esempio calice salice $regex(irc-zone.org il nuovo irc resource italiano,.esourc..) Ritorna 1 - - OPERATORI QUANTITATIVI {n} : lunghezza pattern Controlla che la lunghezza del pattern sia quella indicata.. $regex(Example for pattern lenght,t{2}) Restituisce 1 Controlla che all'interno della stringa vi sia la substringa "t" ripetuta due volte consecutivamente. Il lenght può anche essere compreso fra due numeri {n,m} , questa operazione in mIRC necessita della creazione di una variabile e deve essere eseguita mediante script : alias reg_lenght { set %rl ciao{1,2} echo -a $regex(ciaociao federico,%rl) } Restituisce 1 poichè la substringa "ciao" viene riscontrata 2 volta all'interno della stringa.. Naturalmente si tiene conto anche degli spazi, vale a dire che non vi deve essere nessun carattere fra le ripetizioni della substringa quindi $regex(ciao ciao federico,%rl) Restituisce 0. {n,} ritorna 1 matching positivo se la substringa è presente all'interno del testo almeno n volte. -
+ : Trova 1 o più volte $regex(abcde,c.+) Restituisce 1 Infatti viene richiesto che dopo la "c" ci sia almeno un carattere qualsiasi (in questo caso due). - * : Trova 0 o più volte Simile a + , l'uso di questo operatore non è consigliato quando si ricerca 1 sottostringa che sia uguale alla stringa.Infatti controlla che il pattern esista 0 o più volte.. $regex(abcd,c*)
$regex(abcd,v*) Restituisce in entrambi i casi 1 - ? : Trova 0 o 1 volta Ha funzione simile a + e *.Cerca una substringa che può non esistere, se esiste deve essere presente 1 sola volta. - - Un caso particolare si ha quando l'operatore fà parte della stringa di ricerca, cioè deve essere ricercato come carattere, e non deve fungere da operatore, in questo caso utilizzeremo l'escape (\). $regex(www.irc-zone.org,www\.irc-zone) Si assicura che dopo www ci sia effettivamente il punto (.) e non un carattere qualsiasi.
$regex(Vince 100$ alla slot-machine,100\$) Cerca all'interno della stringa la substringa 100$, e non una stringa che finisca con 100. - - A questo punto molti avranno capito come funzionano le regex, allora vediamo alcuni esempi che ci illustano in che modo possano essere applicate al mircscripting. alias contr_nick { var %i = ^[\_\[\]\{\}a-zA-z]{1}[_\-\[\]\{\}a-zA-z-0-9]{1,29}$ if ($regex($1,%i) == 1) { echo -a Valid Nickname } else { echo -a Erroneous Nickname [N/A] } } L'alias soprastante controlla la validità della sintassi di un nick. Soffermiamoci sulla regex : innanzitutto il pattern viene loggato nella variabile %i e controlla che il primo carattere sia _ o una parentesi quadra (aperta o chiusa) o una graffa (aperta o chiusa) o una lettera compresa fra a e z e A e Z. Effettua anche un controllo sui restanti caratteri che compongono il nick assicurandosi che siano _ o - o una parentesi quadra (aperta o chiusa) o una graffa (aperta o chiusa) o una lettera compresa fra a e z e A e Z o un numero e che non sia lunghezza non superi i 29 caratteri ( che sommati alla prima lettera dà 30, lunghezza massima di un nick) alias contr_date { var %x = ^[0-9]{2}/[0-9]{2}/[0-9]{4}$ if ($regex($1,%x == 1) { echo -a Valid date } else { echo -a Invalid date. Correct syntax is : dd/mm/yyyy } } Questo semplice alias si assicura attraverso una regex che la data inserita sia nel formato dd/mm/yyyy attraverso un controllo sulle classi e sulla lunghezza dei pattern. - - Con questi esempi si conclude il mio tutorial..spero di essere stato il più chiaro possibile ma soprattutto di essere stato esauriente. Alla prossima.
|