Espressioni Regolari
      prof. Marcello Missiroli
       (Itis Corni. Modena)
sa sono le espressioni regol
sa sono le espressioni regol

        RegExp per gli amici
descrivono strutture all'inter
per cercare e modificare le
eate negli anni '50
ormalizzate da Stephen Cole Kleen
e esistono vari dialetti
Perché usarle?
Perché usarle?
nto potente nelle mani di ogni programmatore (specie in
Perché usarle?
nto potente nelle mani di ogni programmatore (specie in
Perché usarle?
nto potente nelle mani di ogni programmatore (specie in

e sostituzione semplice e banale....
Perché usarle?




         ..ma bisogna "vedere" la struttura!
Ma soprattutto vi trasforma da così..
a così!
Learning by example
Caratteri
/salve/          si:
                 "salve"
                 "salve a tutti"
                 "E' la salvezza"

                 no:
                 "sale"
                 "Salve"
"salv<b>e</b>"
Sequenza di "escape"
//(salve)//         si:
                  "/(salve)/"


                  no:
                  "salve"
                  "(salve)"
Alternative
/en|it|fr|de/   si:
                "en"
                "it"
                "fritte"

                no:
                "darf"
Raggruppamenti
/(it|fr)_(IT|CH)/          si:
                           "it_IT"
                           "it_CH"
                           "fr_IT"
Due gruppi indipendenti!
                           no:
                           "it_it"
Ancoraggio
/^(it|fr|en|de)$/      si:
                       "it"
                       "en"
                       "fr"
  Inizio e fine riga
                       no:
                       "italia"
Scelta di caratteri
/salv[eoa]/    si:
               "salve"
               "salva"
               "salvo"

               no:
               "salv"
               "salvoa"
"salvè"
Scelta di caratteri
/^Cl. [1-5]BInfo/   si:
                    "Cl. 4BInfo"
                    "Cl. 5BInformatica"

                    no:
                    "BInfo"
                    "Cl. 6Binfo"
Scelta di caratteri: complemento
/^Cl. [^1-5]BInfo/   si:
                     "Cl. 0BInfo"
                     "Cl. 6BInformatica"

                     no:
                     "Cl. 3Binfo"
Scelte condizionate
    /Iron(?=man)/                    si:
                                 "Ironman"

                                    no:
                                    "Iron"
che in versione negativa, usando (?!man)
Scelte condizionate
     /(?<=Iron)man/               si:
                                 "Ironman"

                                     no:
                                     "man"
che in versione negativa, usando (?<!man)
                                     "Iron"
Scelta di caratteri: "word class"
     /^w$/                          si:
                                     "a"
                                     "_"

                                     no:
quello che può costituire un nome di variabile
                                     "("
Scelta di caratteri:altre classi
/s/           Spazio bianco (anche tab)
               ""
/W/           Non-parola
               ")"
/D/           Non-numero
               "a"
/S/           Non-spazio bianco
               "="
Scelta di caratteri: qualsiasi
/^......$/     si:
               "abacab"
               "123/56"

               no:
               "("
Qualsiasi quantità (anche 0)
/^d*$/       si:
              "123456"
              ""

              no:
              "1a"
Qualsiasi quantità (minimo 1)
/^d+$/       si:
              "123456"


              no:
              "1a"
              ""
Uno o nessuno
/^pera?$/   si:
            "pera"
            "pere"
            "per"
            no:
            "peraa"
Specificare la quantità
/^059-d{7}$/     (esattamente sette)
                  "059-5556734"
/^059-d{6,7}$/   (da sei a sette)
                  "059-555673"
Attenti...operatori avidi!
/_(+*)_/
               "_bla_ _bla_"
Attenti...operatori avidi!
      /_(+*)_/
                                      "_bla_ _bla_"
                                       ^^^^^
ova la stringa più lunga possibile!
                                       ^^^^^^^
                                       ^^^^^^^^^^^
Attenti...operatori avidi!
/_(.+?)_/
                    "_bla_ _bla_"
                     ^^^^^
Ora si ferma qui!




Usare +? per renderlo meno avido!
Gruppi catturati
Di che si tratta?
uò essere riutilizzato subito o in seguito per manipolare

i dipende dal linguaggio usato.
Esempio
<a href="http://test.com">test</a>

Applichiamo a questo testo l'espressione

<a href="/(.*?)">(.*?)</a>/

l sistema scompone la stringa in cinque gruppi, in questo modo:
<a href="http://test.com">test</a>
l sistema scompone la stringa in cinque gruppi, numerandoli da 1 a 5
Esempio
usare questi gruppi come blocchi del Lego e costruire il risultato che c

n PHP,
 <a href="/)(.*?)(">)(.*?)(</a>)',$1.$2.$3.$2.$5 , "<a href="http://test.co



test.com">http://test.com</a>
Nomi dei gruppi catturati
Il nome dato ad ogni gruppo dipende dal linguaggio utilizzato


 Gruppo 1   PHP   .NET   Perl    Ruby     sed     Javascript




 1         X            X       X        X


 $1         X     X      X                        X


 ${1}       X     X      X
Nome del gruppo trovato
Esiste anche il "gruppo 0", ovvero l'intero testo trovato
    Gruppo 1   PHP   .NET   Perl   Ruby   sed     Javascript




    0         X                   X


    $0         X     X
.
    ${0}       X     X      X


    &                             X


    $&               X      X                     X
Di che si tratta?
uò essere riutilizzato subito o in seguito per manipolare

i dipende dal linguaggio usato.
Regex in azione




e/o programmi hanno supporto per
        Sono facili da usare!
Putroppo...




no supporto diretto per le RegEx op
Esempio: ruby
#!/usr/bin/ruby
phone = "2004-959-559
# Togli tutto tranne i numeri
phone = phone.gsub!(/D/, "")

#ora la variabile numero è uguale a
2004959559
Esempio: grep
ricerca di righe in "files" che contengono
grep strano files        ...la parola strano
grep '^strano' files     ...solo a inizio riga
grep 'strano$' files     ...solo a fine riga
grep '^strano$' files ...solo la parola strano
grep '[Ss]trano' files ... strano o Strano
grep '^$' files           ... righe vuote
grep '[0-9][0-9]' file    ... coppie di cifre
Esempio: Javascript
var espressione = /^[a-z0-9]/;
var stringa = "Unastringa";
if (!espressione.test(stringa))
{ document.write("La stringa non è valida!"); }
----------------------------------------------------
var string2="(304)434-5454"
parsestring2=string2.replace(/[()-]/g, "")
//restituisce "3044345454", toglie "(", ")", e "-")
Esempio: grep
ricerca di righe che contengono
grep strano file       ...la parola strano
grep '^strano' files    ...solo a inizio riga
grep 'strano$' files    ...solo a fine riga
grep '^strano$' files ...solo la parola strano
grep '[Ss]trano' files ... strano o Strano grep
grep '^$' files          ... righe vuote
grep '[0-9][0-9]' file   ... coppie di cifre
Esempio: Java
l titolo di una pagina HTML
"(?i)(<title.*?>)(.+?)(</title>)";
dated = EXAMPLE_TEST.replaceAll(pattern, "$2");
sce true se la stringa è esattamente "True" o "true, "Yes
olean isTrueOrYes(String s){
s.matches("[tT]rue|[yY]es"); }
Esempio: Java
gex.Matcher; import java.util.regex.Pattern;

xTestPatternMatcher {
inal String EXAMPLE_TEST = "This is my small example string which I'm going to use for p

void main(String[] args) {
pattern = Pattern.compile("w+",CASE_INSENSITIVE);
 matcher = pattern.matcher(EXAMPLE_TEST);
 lla tutte le occorenze
atcher.find()) {
 em.out.print("Start index: " + matcher.start());
 em.out.print(" End index: " + matcher.end() + " ");
 em.out.println(matcher.group());}
  sci tutt gli spazi con tabi
 eplace = Pattern.compile("s+");
 matcher2 = replace.matcher(EXAMPLE_TEST);
out.println(matcher2.replaceAll("t")); } }
Esempio: C++
ard per le regex. Occorre studiarsi la versione



ce(str, rx, replacement);
6 “ricette”

Non perfette al 100%, utili come base di lavoro
1. Email valida?
_]+([.][a-zA-Z0-9_]+)*[@][a-zA-Z0-9_]+([.][a-zA-Z0-9_]+
2. Username valido?
/^[a-zd_]{5,20}$/
3. Indirizzo IP?
0-9]{2}|2[0-4][0-9]|25[0-5]).){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4
4. Carta di credito?
3})?|5[1-5][0-9]{14}|6011[0-9]{12}|3(?:0[0-5]|[68][0-9])[0-
5. URL?
s|ftp)://([A-Z0-9][A-Z0-9_-]*(?:.[A-Z0-9][A-Z0-9_-]*)+):
6. Codice Fiscale?
abcdehlmprstABCDEHLMPRST]{1}[0-9]{2}([a-zA-Z]{1}[
Imparate le BASI!
Ci sono cose nella vita che bisogna per forza imparare..
Imparate le BASI!
Ci sono cose nella vita che bisogna per forza imparare..
Per tutto il resto c'è
Sitografia
Raj Kissu Rajandran: "regular-expressions-101"
Lars Vogel: "JavaRegularExpressions"
Brigitte Nellinek: "regular-expressions-eine-einfhrung"
Compago.it: "esempi-pratici-di-espressioni-regolari"
Licenza

More Related Content

PDF
Cattive abitudini e-lineeguida
PDF
Appunti Basi(05 06)
PDF
Spyppolare o non spyppolare
PDF
Ruby in 25 minuti
PDF
Lezione 15 (2 aprile 2012)
PPT
Stringhe java
KEY
Pycrashcourse
Cattive abitudini e-lineeguida
Appunti Basi(05 06)
Spyppolare o non spyppolare
Ruby in 25 minuti
Lezione 15 (2 aprile 2012)
Stringhe java
Pycrashcourse

Viewers also liked (20)

PPT
Corso Moodle: presentazione
ODP
Il ciclo for
ODP
Uefi: l'eterna lotta tra il bene e il male
PPT
Programmazione a oggetti tramite la macchina del caffé (pt. 3)
ODP
Lo stack: tipo di dato astratto e implementazione in Java
PPT
Corso Moodle: perché?
PPT
3 Linux Espressioni Regolari
PDF
Compressione di insiemi di espressioni regolari tramite programmazione geneti...
ODP
Eccezioni in java
ODP
L'avvento del programmatore sociale
PPT
Moodle: i compiti (homework)
ODP
Investire nelle user story
PDF
Linguaggi Formali Compilazione: Grammatiche
PDF
Analisi delle differenze strutturali nelle espressioni regolari costruite da ...
ODP
Routing dinamico
ODP
The Sequel to sql
PDF
Le Espressioni Regolari e gli Automi
ODP
Controllo di versione e Git
ODP
Introduzione al dns
PPT
Il sistema binario
Corso Moodle: presentazione
Il ciclo for
Uefi: l'eterna lotta tra il bene e il male
Programmazione a oggetti tramite la macchina del caffé (pt. 3)
Lo stack: tipo di dato astratto e implementazione in Java
Corso Moodle: perché?
3 Linux Espressioni Regolari
Compressione di insiemi di espressioni regolari tramite programmazione geneti...
Eccezioni in java
L'avvento del programmatore sociale
Moodle: i compiti (homework)
Investire nelle user story
Linguaggi Formali Compilazione: Grammatiche
Analisi delle differenze strutturali nelle espressioni regolari costruite da ...
Routing dinamico
The Sequel to sql
Le Espressioni Regolari e gli Automi
Controllo di versione e Git
Introduzione al dns
Il sistema binario
Ad

Similar to Espressioni regolari (10)

PDF
Py a5 python-text
PDF
11 - Programmazione: Tipi di dato strutturati pt. 2
PPT
Php Funzioni Built In Barbiera 97
PDF
Scala Programming Linux Day 2009
ODP
Creare un proprio linguaggio di programmazione per il web e applicazioni desk...
PDF
Groovy e Domain Specific Languages
ODP
Codemotion 2012 creare un proprio linguaggio di programmazione
PPT
Java codestyle & tipstricks
ODP
Rubynetto
PDF
Introduzione al Perl (BMR Genomics) - Lezione 1 Agosto 2014
Py a5 python-text
11 - Programmazione: Tipi di dato strutturati pt. 2
Php Funzioni Built In Barbiera 97
Scala Programming Linux Day 2009
Creare un proprio linguaggio di programmazione per il web e applicazioni desk...
Groovy e Domain Specific Languages
Codemotion 2012 creare un proprio linguaggio di programmazione
Java codestyle & tipstricks
Rubynetto
Introduzione al Perl (BMR Genomics) - Lezione 1 Agosto 2014
Ad

More from Marcello Missiroli (13)

PDF
Algorithmist guide II
PPTX
Guida del perfetto Algoritmista I
ODP
Workshop: Introduzione ad TDD
PPTX
Dal c a Java (3/3)
PPTX
Dal C a Java (2/3)
PPTX
Dal C a Java (1/3)
ODP
PPT
Sviluppo degli algoritmi
PPTX
5 stadi dello sviluppo di un gruppo
PDF
Vogliamo programmatori stupidi e pigri!
PPTX
Big O Notation
ODP
Insegnare Agile
ODP
Introduzione a java doc
Algorithmist guide II
Guida del perfetto Algoritmista I
Workshop: Introduzione ad TDD
Dal c a Java (3/3)
Dal C a Java (2/3)
Dal C a Java (1/3)
Sviluppo degli algoritmi
5 stadi dello sviluppo di un gruppo
Vogliamo programmatori stupidi e pigri!
Big O Notation
Insegnare Agile
Introduzione a java doc

Espressioni regolari