Utente:LoStrangolatore/Espressioni regolari/Esercizi

Idee per ulteriori esercizi

Conoscenza della sintassi:

  • presento la sintassi e chiedo il significato (scelta multipla)
  • presento sintassi e chiedo il nome (lista a dx e lista a sx, oppure scelta multipla)
  • presento regex e chiedo il significato (lista a dx e lista a sx, oppure scelta multipla)
  • verifica, in un editor di testo, se le seguenti regex individuano delle corrispondenze nelle stringhe seguenti (lista a sx e lista a dx)

Dalla regola alla regex:

  • scrivi una regex che individui l'insieme di stringhe definito da una certa specifica di cui fornisco il link (esempio: la specifica RFC 2822 linkata su w:email).

Mettere dei cruciverba:

  • dare l'img del cruciverba, con alcune parole all'interno, e chiedere di risolverlo cercando nel Wikizonario o su Wikipedia usando quei 2 tool che usano le regex. Vedi w:Wikipedia:Pareri_su_Wikipedia#Cruciverba. Usare in altro modo questa idea?
  • fare un percorso x imparare che dia un elenco di esercizi e chieda di risolverli consultando il capitolo dei concetti generali ed evtlm i capitoli specializzati dei motori di analisi. L'elenco degli esercizi guida il lettore nella lettura progressiva del capitolo dei concetti generali, evtlm con salti, così il lettore impara le cose perché vede sempre le stesse cose


Conoscenza della sintassi modifica

Vero/falso
  1. La regex a{5} individua cinque stringhe diverse.
  2. La classe [a-zA-Z] individua tutte le lettere dell'alfabeto italiano.
  3. La regex \s* individua le stringhe composte da zero o più caratteri di spaziatura.
  4. La regex Ipse (dix)it cerca le stesse stringhe della regex Ipse dixit.
  5. Le seguenti regex cercano le stesse stringhe:  Ipse (dix)it\1{2}  •  Ipse (dix)it\1\1  •  Ipse (dix)itdixdix.
  6. Le seguenti regex cercano le stesse stringhe:  e(?!nne).{5}  •  e[^n][^n][^e]..
Domande
  1. Quante stringhe sono accettate dalla regex a\bc\bde?
  2. Quali stringhe sono accettate dalla regex $TODO^?
  3. Scrivi alcune stringhe accettate dalla regex ([Ee])co+(-\1co+)*.
  4. Scrivi alcune stringhe che non sono accettate dalla regex ([Ee])co+(-\1co+)*. Rifletti, prima di rispondere.
  5. Che differenza c'è tra [abc]{3} e ([abc])\1{2}?
Significato delle regex

Prova le seguenti regex in un editor di testo. Cosa fanno? Descrivi il loro significato con parole tue.

  1. ...
Scrivi una regex che...

Scrivi una regex che... e provala in un editor di testo:

  1. ... accetta qualunque stringa.
  2. ... accetta qualunque stringa, eccetto la stringa vuota.
  3. ... cerca tutti i punti in cui una parola termina con una vocale dell'alfabeto italiano.
  4. ... cerca tutte le parole che terminano con una vocale dell'alfabeto italiano, memorizzando il testo della parola in un capturing group.
  5. ... individua le quattro operazioni aritmetiche: +, -, *, /. Quali di questi quattro caratteri sono preceduti dal backslash?
  6. ... accetta i tre nomi con cui gli inglesi denominano le espressioni regolari.
  7. ... contiene la regex [Uu-]*|reg(ex)+ ma accetta solo la stringa vuota.
  8. ... cerca noi, ma non noia. Perché noi[^a] non funziona sempre? Perché noi[a]? non funziona?
Altre
  1. Scrivi la regex più breve che accetta solo le due parole roma e amor.
  2. Scrivi la regex più breve che accetta qualunque stringa di n caratteri alfanumerici.
  3. Scrivi la regex Alessandro Manzoni|Alessandro M.|A. Manzoni|A. M. in modo più compatto.
Esercizi di cui non si fornisce la soluzione

Scrivi una regex che individua tutte le voci del verbo...

  1. accogliere.

Scrivi le regex che accettano tutte le traslitterazioni dei seguenti nomi stranieri che sono registrate sulla Wikipedia in lingua italiana:


Dalla regola alla regex modifica

Questi esercizi hanno il solo scopo di testare l'abilità del lettore nel risolvere determinati problemi, per i quali il linguaggio di programmazione o il programma in uso potrebbe fornire mezzi più efficaci: pertanto, non vanno considerati degli esempi d'uso da imitare nella vita reale.


Scrivi una regex che...
  1. ... individua l'insieme delle stringhe che contengono un numero pari di caratteri.
  2. ... individua l'insieme delle stringhe la cui lunghezza non è un numero primo.
Scrivi un'espressione regolare che individua il seguente formato di dati:

Per informazioni più dettagliate, vedi la pagina Suggerimenti

  1. Numeri interi relativi
  2. Numeri relativi con virgola
  3. E-mail
  4. Denaro, in valute a scelta. Esempio: 3,50 €
  5. Indirizzo IP. Suggerimento: prima scrivi una regex che individua una successione di quattro terne di cifre separate dal punto, poi perfezionala per escludere gli zeri iniziali, quando sono superflui.
  6. Date, nel formato dd/mm/yyyy (ovvero: una o due cifre per il giorno, una o due per il mese, e quattro per l'anno). Esempio: 11/11/1915
  7. Date, nel formato dd mon yyyy (ovvero: una o due cifre per il giorno, le prime tre lettere del nome del mese, e quattro cifre per l'anno). Esempio: 11 nov 1915
Cerca le parole

Elenca le parole presenti nei testi di seguito indicati e che soddisfano le condizioni scritte di seguito.

Cerca nel testo... le parole che...
TODO: "Titolo", di Autore (→ apri) TODO
Regex e automi a stati finiti

Disegna lo schema di un automa a stati finiti che corrisponde alla regex:

  1. TODO

Per ognuno dei seguenti automi a stati finiti, descrivi cosa fa e stendi la regex equivalente. Per ingrandire un'immagine, cliccaci sopra.

  1. cerca tutte le "q" che non sono seguite dalle "u".
  2. cerca tutte le "q" che non sono seguite dalle "u", eccetto che per le "q" scritte tra virgolette.
  3. cerca tutti i tag HTML <A>. Ricorda che HTML è un linguaggio a spaziatura libera.
  4. ...

Scrivi la regex e, se esiste, disegna l'automa a stati finiti:

  1. che individua solo le stringhe contenenti un numero pari di p e un numero dispari di d

Trasformazione di testi modifica

Eccetto dove indicato diversamente, si chiede di modificare il testo solo tramite le regex e non a mano. Potrebbe essere necessario applicare in sequenza più di una espressione regolare.


Sostituzione e trasformazione del testo
  1. Separa le preposizioni articolate con + articolo, che oggi sono poco usate. In altre parole: trasforma cogli, colla e simili nella rispettiva versione moderna, cioè con gli, con la, ecc.
  2. Trasforma le stringhe [[xxx:yyy]] nella forma [[xxx:]] dove xxx è una sequenza di due o tre caratteri alfanumerici e yyy è una stringa di lunghezza arbitraria che non contiene i seguenti caratteri:  # < > [ ] | { }
  3. Vuoi correggere tutte le occorrenze di perche, perche' e perchè con la forma perché. Scrivi una regex che riconosce queste parole e la stringa che le sostituisce con il testo esatto.
Wikificazione

Trasforma il testo a sinistra nella forma che è a destra. Altri testi da wikificare sono reperibili su Wikipedia, nella Categoria:Wikificare.

1.

''CAP - Titolo originale'' (CAP - Titolo tradotto)
:Riassunto

''CAP - Titolo originale'' (CAP - Titolo tradotto)
:Riassunto
...

[[Libro#CAP|CAP]] - Titolo originale
:''Titolo tradotto''
:Riassunto

[[Libro#CAP|CAP]] - Titolo originale
:''Titolo tradotto''
:Riassunto
...

Note: CAP è un numero romano da I a XXI.

2.

Autore: "Titolo" (id)
[URL1 Tomo1] - Titolo1 (anno1)
[URL2 Tomo2] - Titolo2 (anno2)
[URL3 Tomo3] - Titolo3 (anno3)
...

''Titolo'' (Autore)
:(id) Tomo1 - "Titolo1" (anno) [URL1 → apri]
:(id) Tomo2 - "Titolo2" (anno) [URL2 → apri]
:(id) Tomo3 - "Titolo3" (anno) [URL3 → apri]
...

Note: id è alfanumerico; gli URL non contengono spazi.

3.

=== n° capitolo - Titolo ===
Testo

=== Capitolo n ===
''Titolo''<br />
Testo

Esercizi di cui non si fornisce la soluzione
  1. Apri una pagina a caso di Wikibooks e converti il markup wiki in un formato che conosci - HTML, XML, ecc. - senza editarlo a mano, ma con il solo ausilio delle regex.
  2. Esercizio inverso: sei in grado di trasformare una pagina HTML in codice wiki? Apri una pagina a caso di Wikibooks e visualizza il codice HTML tramite le opzioni del tuo browser (clic destro, oppure tramite i menu del browser).

Esercizi sugli aspetti teorici modifica

I seguenti linguaggi sono regolari oppure no? Dimostralo.

  1. Il linguaggio definito dalla regex (a)\1*
  2. L'insieme delle stringhe  1|a  •  2|aa  •  3|aaa  •  ...
  3. Il linguaggio definito dalla regex Car([ao]), bentornat\1!
  4. L'insieme delle stringhe che contengono il solo carattere a e che hanno lunghezza uguale al quadrato di un numero naturale.
  5. L'insieme delle espressioni matematiche composte dai seguenti elementi: i numeri, le quattro operazioni algebriche, le parentesi.

Rispondi alle seguenti domande:

  1. Cos'è una grammatica formale? Qual è la differenza tra grammatica formale e linguaggio formale?
  2. Qual è la peculiarità delle grammatiche regolari rispetto alle altre grammatiche?
  3. Che differenza c'è tra le grammatiche regolari e le espressioni regolari?

Espressioni regolari e linguaggi modifica

TODO: aprire uno spazio dove gli utenti possono discutere delle proprie personali soluzioni?


Descrivere un linguaggio tramite espressioni regolari
  1. Scrivi una regex, destinata a un ambiente di esecuzione a tua scelta, che individua l'insieme di tutte le regex che sono supportate da quell'ambiente di esecuzione e che contengono da zero ad un massimo (a tua scelta) di capturing group innestati.
  2. Scrivi una regex che descrive le frasi di un linguaggio che conosci bene: XML, HTML, CSS, CSV, il linguaggio di markup di MediaWiki, un linguaggio di programmazione imperativo, ecc. Potrai proporre e discutere le tue soluzioni online.
    Esempi:
    1. HTML: tag con o senza attributi; commenti; ...
    2. Linguaggi imperativi: dichiarazioni di variabili; intestazioni di funzioni o metodi; istruzioni; dichiarazioni di tipi di dato personalizzati; ...
    3. MediaWiki: link; template con o senza parametri; ...
Conversione tra formati
  1. Genera documentazione (HTML, PDF, MediaWiki, ecc.) a partire da codice sorgente scritto in un linguaggio di programmazione che conosci.
  2. Una azienda intende realizzare un compilatore per disegni o documenti espressi in un formato testuale a tua scelta: SVG, HTML, ecc. Il software dapprima genera codice sorgente, scritto in un linguaggio di programmazione imperativo ed una libreria grafica a tua scelta, dopodiché compila questo codice. Per generare il codice sorgente, si serve di una tabella con due colonne: in una, le regex che riconoscono le frasi del file, nell'altra le istruzioni parametrizzate con i backreference.
    Il tuo compito è riempire la tabella. Suggerimento: se il formato è troppo complesso, preferisci una versione non rigorosa e formalmente errata, ma più semplice da scrivere. Per esempio, i tag SVG includono spesso del codice CSS; quindi, può essere vantaggioso inserire un segnaposto convenzionale nelle regex, invece di una sotto-espressione (lunga quanto illeggibile) che definisca i CSS.
Altri esercizi
  1. Pensa ad una nuova estensione per la sintassi delle regex, per un ambiente di esecuzione a tua scelta. Questa estensione permetterebbe di definire linguaggi non regolari? Potrebbe essere ridotta ad una forma che usi solo i costrutti supportati da quell'ambiente di esecuzione?
    Esempio: si potrebbe inventare un operatore AND, che cerchi tutti i punti in cui una stringa rispetta contemporaneamente due regex diverse. Puoi esprimerlo usando solo i costrutti che già conosci?