Utente:LoStrangolatore/Espressioni regolari/Soluzioni degli esercizi

Conoscenza della sintassi

modifica
Vero/falso
  1. Falso: individua solo una stringa, cioè aaaaa.
  2. Falso.
  3. Vero.
  4. Vero, tuttavia la prima ha l'effetto aggiuntivo di inserire nel primo capturing group la stringa dix.
  5. Vero.
  6. Falso: la prima chiede che il secondo, il terzo e il quarto carattere non siano contemporaneamente pari ad n, n ed e rispettivamente, quindi individua più stringhe della seconda regex. Ad esempio, ebbero.
Domande
  1. Zero, perché non c'è un word boundary tra due caratteri alfanumerici consecutivi (nell'esempio, i caratteri c e d).
  2. Nessuna: i simboli ^ e $ sono invertiti.
  3. Eco  •  ecooooo  •  Eco-Ecoooo-Ecoo-Eco • ...
  4. Banalmente: la stringa vuota; tutte le stringhe del tipo [^Eeco-]*; tutte le stringhe lunghe meno di tre caratteri; ecc.
  5. La prima significa: la regex [abc] ripetuta 3 volte; la seconda significa: uno dei tre caratteri a, b o c ripetuto 3 volte. Quindi, la seconda individua solo aaa, bbb, ccc; la prima individua queste e anche le altre combinazioni: aca, cab, ecc.
Significato delle regex
  1. ...
Scrivi una regex che...
  1. .*
  2. .+
  3. [aeiou]\b
  4. \b(\w*[aeiou])\b
  5. Ricordando che i quantificatori perdono il loro significato speciale se sono in una classe di caratteri, e che il trattino va messo all'inizio o alla fine: [+*/-]
  6. I nomi sono regex, regexp e regular expression, pertanto la regex è [Rr]eg(exp?|ular expression)
  7. ([Uu-]*|reg(ex)+){0}
  8. TODO usando un lookahead. La prima regex non funziona nel caso in cui la stringa termini con noi; la seconda regex non funziona perché il punto interrogativo semplicemente ignora una eventuale a.
Altre
  1. roma|amor
  2. \w{n}
  3. TODO. Note: 1. mettere gruppi non-capturing; 2. tenere conto del fatto che il punto è un metacarattere (è stato usato apposta, per trarre in inganno il lettore)

Dalla regola alla regex

modifica
Scrivi una regex che...
  1. (..)*
  2. Un numero primo è un numero che non può essere espresso come prodotto di due numeri, a parte 1 e se stesso. Quindi, le stringhe cercate hanno una lunghezza che può essere scritta come prodotto di altri due numeri. Quindi, la regex è TODO
Scrivi una regex che individua il seguente formato di dati:
  1. TODO
  2. TODO
  3. TODO
  4. Esempio: TODO
  5. Prima regex: ([0-9]\.){3}[0-9]   Seconda regex: ([1-2]?[1-9]?[0-9]\.){3}([1-2]?[1-9]?[0-9])
  6. TODO
  7. TODO
Cerca le parole
Cerca nel testo... le parole che...
TODO TODO
Regex e automi a stati finiti

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

  1. ...

Per ognuno dei seguenti automi a stati finiti, descrivi cosa fa e stendi la regex equivalente:

  1. ...

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

  1. ...

Trasformazione di testi

modifica
Sostituzione e trasformazione del testo
  1. La regex è ([Pp])erch(e'?|è) e la stringa per la sostituzione è \1erché
  2. La regex è \[\[(\w*):([^\]]*)\]\] (si è usata una coppia di parentesi tonde in più, per chiarezza). Ai fini della ricerca in un elenco di stringhe che sono nella forma presentata, è irrilevante la lunghezza di xxx; importa solo che non contenga i due punti, cioè il carattere di terminazione; e questa condizione è garantita dal fatto che sono presenti solo caratteri alfanumerici. Parimenti, è irrilevante conoscere quali caratteri sono esclusi da yyy, ovviamente eccezion fatta per la parentesi quadra chiusa, cioè il delimitatore che termina ciascuna delle stringhe in ingresso.
    La stringa per la sostituzione è [[\1:]]
Wikificazione

Eccetto dove indicato diversamente, si riporta una delle possibili soluzioni.

  1. TODO
  2. Il primo passo è aggiungere l'id ad ogni riga: si analizza il testo intero con una regex che memorizza i dati della prima riga e il testo delle n righe che seguono, servendosi dei capturing group; si riscrive il testo con una stringa di sostituzione che, servendosi dei backreference, omette l'id nella prima riga (formattandola come richiesto dall'esercizio) e lo inserisce nelle righe seguenti[È realmente possibile? Con quale regex???].
    Il secondo passo è riformattare le righe che seguono, cioè analizzare il testo con la regex ^(\w*) \[([^ ]*) ([^\]]*)\] - "([^"]*)" \((.*)\)$ e riscriverlo con la stringa di sostituzione (\1) \3 - "\4" (\5) [\2 → apri]\n
  3. TODO

Esercizi sugli aspetti teorici

modifica

I seguenti linguaggi sono regolari oppure no? Dimostralo.

  1. Sì, perché la regex significa il carattere a, seguito da quello stesso carattere ripetuto zero o più volte, quindi, evidentemente, definisce lo stesso linguaggio della regex a+
  2. No. Intuitivamente, la ragione è che l'esecutore, per memorizzare il numero di occorrenze del carattere, numero che non è noto a priori, deve fare uso di un numero di stati interni illimitato. Ciò vuol dire che questo compito non può essere risolto da un automa a stati finiti.
  3. Sì, perché è possibile costruire un automa a stati finiti che implementa la regex (TODO mettere l'immagine dell'automa)
  4. No. Vedi anche [1]
  5. No. Vedi anche [2]

Rispondi alle seguenti domande:

  1. TODO
  2. TODO
  3. Una grammatica regolare è un insieme di regole che definisce un linguaggio regolare. Una espressione regolare è una scrittura compatta che identifica un linguaggio regolare o non regolare.