Salve a tutti, ho appena iniziato ad usare Ubuntu per l'università e volevo imparare a scrivere in bash...ci sono alcuni esercizi che non riesco a fare spero che qualcuno mi possa aiutare: Espressioni regolari

1. Scrivere una espressione regolare che verifica un indirizzo di posta elettronica 
2. Scrivere una espressione regolare che verifica un qualsiasi tag HTML. Un elenco dei tag HTML sono disponibili a http://www.francescobenignetti.it/wp-content/uploads/2014/05/elenco-tag-HTML.pdf. Tipicamente un tag HTML è della forma <TAG sequenza di caratteri numeri o altro </TAG> oppure <TAG> sequenza di linee <\TAG>.
3. Scrivere una espressione regolare che verifica se una stringa di 7 caratteri al massimo è palindrome.
4. Scrivere una espressione regolare che verifica una data (con delimitatori ammessi ./-) considerando come anni validi dal 1900 ad oggi.

Grazie mille

chiesto 24 Mar '19, 00:27

l_paolo_x's gravatar image

l_paolo_x
20112

modificato 12 Oct '23, 23:52

enzotib's gravatar image

enzotib ♦♦
14.1k113187

in rete trovi molte guide:

http://www.pluto.it/ildp/guide/abs.html

(24 Mar '19, 10:44) sacarde sacarde's gravatar image

Premessa: per testare le tue regex in tempo reale ti consiglio questo sito https://regex101.com/ In basso metti una serie di stringhe da testare, che verificano o meno la regex, e in alto la regex, e sulla destra trovi la spiegazione di cosa è stato matchato e perché.

Venendo a noi...

= Esercizio 1. =

TL,DR: Senza sapere a quale RFC si riferisce il tuo professore, il primo esercizio è irrisolvibile correttamente.
Se vuoi entrare nei dettagli del perché, puoi continuare a leggere qui sotto.

Nell'accezione più ampia, e citando wikipedia, abbiamo che un indirizzo di posta elettronica è qualcosa della forma local-part@domain dove (e da in poi qui traduco) local-part è lunga al massimo 64 caratteri e il dominio è lungo al massimo 255 caratteri. Inoltre il dominio non può terminare per un punto (.).

Il tutto è definito negli standard RFC 5322 (sezioni 3.2.3 and 3.4.1) e RFC 5321.

== Local part ==

Continuando a tradurre e citare, la local-part può contenere solo:

  • lettere latine maiuscole e minuscole A-Z e a-z,
  • cifre 0-9,
  • i caratteri stampabili !#$%&'*+-/=?^_`{|}~;,
  • il punto ., quando non è il primo o ultimo carattere né è ripetuto più di una volta, a meno che il testo non sia tra virgolette (ad esempio John..Doe@example.com non è valido ma "John..Doe"@example.com è valido).

  • lo spazio e i caratteri speciali "(),:;<>@[\] sono permessi con restrizioni (sono permessi in stringe quotate, e, inoltre, un backslash o una virgoletta doppia " devono essere preceduti da un backslash),

  • i commenti sono permessi con parentesi all'inizio o alla fine della local-part, ad esempio john.smith(comment)@example.com e (comment)john.smith@example.com sono entrambi equivalenti a john.smith@example.com.

In aggiunta a questi caratteri ASCII, i caratteri internazionale superiori al U+007F, codificati come UTF-8, sono permessi dallo standard RFC 6531, anche se alcuni sistemi di mail che accettano SMTPUTF8 e 8BITMIME possono restringere l'accesso quando assegnano delle local-part.

Alcuni domini, come hotmail, accettano solo caratteri alfanumerici, punti, linea e underscore.

=== Domain ===

E ora passiamo al dominio...

Per il dominio le regolo sono più strette, perché deve rispettare i requisiti per un hostname, ovvero deve essere una lista di etichette DNS (label) separate da punti, dove ogni etichetta è limitata a 63 caratteri e può essere formata solo da :

  • lettere latine maiuscole e minuscole A-Z e a-z,
  • cifre 0-9, tenendo conto che i domini di primo livello non possono essere solo cifre,
  • il trattino -, supposto che non sia né il primo né l'ultimo

Inoltre, il nome di dominio può essere un indirizzo IP direttamente, circondato da parentesi quadre, quindi tipo jsmith@[192.168.2.1] o jsmith@[IPv6:2001:db8::1], anche se è raro vederli fuori da mail di spam.

I nomi di dominio internazionali permettono anche dei domini non-ASCII. In sistemi di mail che rispettano gli standard RFC 6531 e RFC 6532, un indirizzo email può essere codificato in UTF-8, sia la parte locale che la parte di dominio.

Esattamente come per la parte locale, inoltre, i commenti tra parentesi tonde sono autorizzati, per cui john.smith@(comment)example.com e john.smith@example.com(comment) sono equivalenti a john.smith@example.com.

== Esempi ==

Indirizzi validi sempre

simple@example.com very.common@example.com disposable.style.email.with+symbol@example.com other.email-with-hyphen@example.com fully-qualified-domain@example.com user.name+tag+sorting@example.com x@example.com example-indeed@strange-example.com admin@mailserver1 example@s.example " "@example.org "john..doe"@example.org

Indirizzi mai validi

Abc.example.com (manca il carattere @) A@b@c@example.com (solo un @ è autorizzato fuori dalle virgolette) a"b(c)d,e:f;g<h>i[j\k]l@example.com (nessuno di questi caratteri speciali è autorizzato fuori dalle virgolette) just"not"right@example.com (le parti quotate devono essere separate da punti o essere tutta la parte locale) this is"not\allowed@example.com this\ still\"not\\allowed@example.com 1234567890123456789012345678901234567890123456789012345678901234+x@example.com

e ci sono esempi che sono validi o meno a seconda dell'RFC di riferimento

Alfabeto latino con diacritici: Pelé@example.com alfabeto greco: δοκιμή@παράδειγμα.δοκιμή caratteri cinesi: 我買@屋企.香港 caratteri giapponesi: 二ノ宮@黒川.日本 caratteri cirillici: медведь@с-балалайкой.рф caratteri Devanagari: संपर्क@डाटामेल.भारत emoticons: 🎃@example.org

per l'ultimo esempio, ti consiglio questa lettura.

Riassumendo, una risposta perfettamente valida secondo un certo RFC è completamente sbagliata secondo un altro. Senza questa specifica l'esercizio non può essere svolto completamente.

= Esercizio 2. =

Nemmeno questa è facile, e di nuovo l'esercizio è incompleto. Ad esempio un tag HTML valido è anche <br/>, e anche <img src="data:image/png;base64,iVBORw0KGgo[...]"/> con una lista arbitrariamente lunga di dati in base64, o ancora degli url, del codice javascript o css, ecc.

Guarda ad esempio la risposta di Haacked a questo problema, e ancora questa risposta non è completa, perché ad esempio matcha anche cose del tipo <tag</tag>> e <tag>asdasdsa</laser> che chiaramente non sono da verificare (il primo perché non è un tag HTML, il secondo perché il tag di apertura e quello di chiusura sono diversi, quindi non si può verificare un HTML così).
Per semplicità te la copio qui

</?\w+((\s+\w+(\s*=\s*(?:".*?"|'.*?'|[\^'">\s]+))?)+\s*|\s*)/?>

ma ricordati di non usarla, perché è incompleta/sbagliata.

Una possibile soluzione potrebbe essere qualcosa del tipo

(<(?'tag'(\w+))>.*<[\\\/](\k'tag')>)|(<(\w+)[\\\/]>)

ma è sintassi PHP, quindi probabilmente devi adattarla a bash (\w significa un qualsia carattere alfabetico, ?'tag' è per dare un nome al gruppo che segue, \k'tag' è per recuperarlo tale e quale, ecc) e non considera ancora tag con parametri, tipo appunto <img src="http://this-is-an-image.png"/>

= Esercizio 3. =

Ora che nell'esercizio 2 hai capito come nominare e recuperare un gruppo, questo è triviale (devi nominare i gruppi delle singole lettere e recuperarli al contrario).

= Esercizio 4. =

Dopo tutto il resto questo è (quasi) facile. Il problema, ancora una volta, sta nel fatto che il problema è mal posto.
Ad esempio, se scrivo il 25 aprile 1999 come Aprile/25.'99, deve passare questa validazione oppure no? Dal testo dell'esercizio sembra proprio di sì...
Idem per le date

25/4/2018 25-apr/2018 25.apr.2018 918-04/25 ecc...

coll. permanente

ha risposto 27 Mar '19, 22:35

dadexix86's gravatar image

dadexix86 ♦♦
17.0k916161

modificato 27 Mar '19, 23:29

La tua risposta
abilita/disabilita anteprima

Segui questa domanda

Via email:

Una volta eseguito l'accesso potrai iscriverti a tutti gli aggiornamenti qui

Via RSS:

Risposte

Risposte e commenti

Basi di markdown

  • *corsivo* o __corsivo__
  • **grassetto** o __grassetto__
  • collegamento:[testo](http://url.com/ "titolo")
  • immagine?![alt testo](/path/img.jpg "titolo")
  • elenco numerato: 1. Foo 2. Bar
  • per aggiungere un'interruzione di riga, aggiungi due spazi a fine riga e premi «Invio»
  • è supportato anche semplice HTML

Tag:

×106
×1

domanda posta: 24 Mar '19, 00:27

domanda visualizzata: 1,793 volte

ultimo aggiornamento: 25 Dec '24, 10:11

Chiedi è un servizio di supporto gestito da Ubuntu-it. Contattaci!

powered by OSQAPostgreSQL database
Ubuntu e Canonical sono marchi registrati da Canonical Ltd.