Advertisement
  1. Code
  2. Web Development

8 Espressioni Regolari che dovreste conoscere

Scroll to top
Read Time: 9 min

() translation by (you can also view the original English article)

Le espressioni regolari sono un linguaggio a se stante. Quando imparate un nuovo linguaggio di programmazione sono quel piccolo sotto-linguaggio che a prima vista non ha senso. Molte volte dovete leggere un altro tutorial, articolo o libro solo per capire il "semplice" pattern descritto. Oggi vedremo otto espressioni regolari che dovreste conoscere per il prossimo progetto di programmazione.

Prima di iniziare controllate alcune delle applicazioni regex nell'Envato Market, come RegEx Extractor.

Potete estrarre email, proxies, IPs, numeri di telefono, indirizzi, tags HTML, URLs, links, date, etc. Inserite una o più espressioni regolari e URLs e avviate il processo.

Estraete, eseguite lo scrape, il parsing, raccogliete i dati.

Esempi di utilizzo

  • Estrarre email da un elenco CSV di indirizzi.
  • Estrarre immagini da files HTML.
  • Estrarre proxies da siti web online.
  • Estrarre risultati URL da Google.

Info di background sulle Espressioni Regolari

Questo è ciò che ha da dire a riguardo Wikipedia:

In computazione, le espressioni regolari forniscono un sistema conciso e flessibile per identificare stringhe di testo d'interesse, come caratteri particolari, parole, o pattern di caratteri. Le espressioni regolari (abbreviate in regex o regexp, con multipli form regex, regexps o regexen) sono scritte in un linguaggio formale che può essere interpretato da un processore di espressioni regolari, un programma che serve come generatore di parsing o che esamina testo e identifica parti che corrispondano alle specifiche fornite.

Ora, questo non ci dice molto riguardo i patterns attuali. Le espressioni regolari che tratteremo oggi contengono caratteri come \w, \s, \1 e molti altri che rappresentano qualcosa di completamente diverso da ciò cui somigliano.

Se preferite imparare qualcosa riguardo le espressioni regolari prima di continuare la lettura, vi suggeriamo di guardare la serie Regular Expressions for Dummies.

Le otto espressioni regolari che vedremo oggi vi permetteranno di trovare corrispondenze con: username, password, email, valori esadecimali (come #fff o #000), slug, URL, indirizzo IP, e tag HTML. Appena l'elenco scende in profondità, le espressioni regolari diventano più confuse. Le immagini delle prime espressioni regolari sono comprensibili, mentre le ultime quattro sono più facili da capire se si legge la spiegazione.

Il punto chiave da ricordare sulle espressioni regolari è che sono leggibili in avanti e indietro allo stesso tempo. Questa frase acquisirà più senso quando parleremo della corrispondenza con i tags HTML.

Nota: i delimitatori usati nelle espressioni regolari sono le barre in avanti, "/". Ogni pattern inizia e finisce con un delimitatore. Se una barra in avanti appare in una regex dobbiamo usare un backslash: "\/".


1. Trovare una corrispondenza con un Username

Matching a usernameMatching a usernameMatching a username

Pattern:

1
    /^[a-z0-9_-]{3,16}$/
2
  

Descrizione:

Iniziamo informando il parser di cercare l'inizio della stringa (^), seguito da qualsiasi lettera minuscola (a-z), numero (0-9), underscore o trattino. Poi il {3,16} ci assicura che siano presenti almeno 3 caratteri, ma non più di 16. Infine, inseriamo la fine della stringa ($).

Stringa corrispondente:

my-us3r_n4m3

Stringa non corrispondente:

th1s1s-wayt00_l0ngt0beausername (troppo lunga)


2. Trovare una corrispondenza con una Password

Matching a passwordMatching a passwordMatching a password

Pattern:

1
    /^[a-z0-9_-]{6,18}$/
2
  

Descrizione:

Trovare la corrispondenza di una password è molto simile al trovare una corrispondenza con un username. La sola differenza consiste nel fatto che al posto di volere lettere, numeri, underscores, o trattini da 3 a 16, li vogliamo da 6 a 18 ({6,18}).

Stringa corrispondente:

myp4ssw0rd

Stringa non corrispondente:

mypa$$w0rd (contiene il simbolo del dollaro)


3. Trovare una corrispondenza con un valore esadecimale

Matching a hex valudMatching a hex valudMatching a hex valud

Pattern:

1
    /^#?([a-f0-9]{6}|[a-f0-9]{3})$/
2
  

Descrizione:

Iniziamo informando il parser di cercare l'inizio della stringa (^). Successivamente, un numero è facoltativo in quanto è seguito da un punto interrogativo. Il punto interrogativo comunica al parser che il carattere precedente - in questo caso un numero - è opzionale, ma di essere "ingordi" e considerarlo se presente. Poi, dentro il primo gruppo (primo gruppo di parentesi), possiamo avere due possibili situazioni. La prima è ogni lettera minuscola tra a ed f o un numero per sei volte. La barra verticale ci dice che possiamo anche avere tre lettere minuscole tra a ed f o numeri. Infine, inseriamo la fine della stringa ($).

La ragione per cui inseriamo il carattere sei prima è dovuta al fatto che il parser prenderà un valore esadecimale come #ffffff. Se lo avessimo invertito in modo che i tre caratteri fossero per primi, il parser prenderebbe solo #fff e non le altre tre f.

Stringa corrispondente:

#a3c113

Stringa non corrispondente:

#4d82h4 (contiene la lettera h)


4. Trovare una corrispondenza con Slug

Matching a slugMatching a slugMatching a slug

Pattern:

1
    /^[a-z0-9-]+$/
2
  

Descrizione:

Userete questa regex se dovrete lavorare con mod_rewrite e pretty URLs. Cominciamo informando il parser di cercare l'inizio della stringa (^), seguita da una o più (il segno più) lettere, numeri o trattini. Infine inseriamo la fine della stringa ($).

Stringa corrispondente:

my-title-here

Stringa non corrispondente:

my_title_here (contiene underscores)


5. Trovare corrispondenza con Email

Matching an emailMatching an emailMatching an email

Pattern:

1
    /^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/
2
  

Descrizione:

Cominciamo informando il parser di trovare l'inizio della stringa (^). All'interno del primo gruppo troviamo una o più lettere minuscole, numeri, underscores, punti o trattini. Abbiamo eseguito l'escape del punto perché un punto non evaso considera ogni carattere. Direttamente dopo deve essere presente un simbolo @. Poi c'è il domain name che deve essere: uno o più lettere minuscole, numeri, underscores, punti o trattini. Quindi un altro punto (usando l'escape) con l'estensione dalle due alle sei lettere o punti. Abbiamo inserito da 2 a 6 a causa del TLD specifico per nazione (.ny.us o .co.uk). Infine inseriamo la fine della stringa ($).

Stringa corrispondente:

john@doe.com

Stringa non corrispondente:

john@doe.qualcosa (TLD troppo lungo)


6. Trovare una corrispondenza con URL

Matching a urlMatching a urlMatching a url

Pattern:

1
    /^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/
2
  

Descrizione:

Questa regex è quasi come prendere la parte finale dell'espressione regolare precedente, inserirla tra "http://" e qualche struttura di file in fondo. Sembra più facile di quel che è. Per cominciare, siamo alla ricerca dell'inizio della linea con il segno di inserimento.

Il primo gruppo di acquisizione è opzionale. Consente all'URL di iniziare con "http://", "https://" o nessuno dei due. Abbiamo un punto di domanda dopo la s per consentire URL che hanno http o https. Al fine di rendere questo intero gruppo opzionale abbiamo solo aggiunto un punto interrogativo alla fine.

Poi è il momento del domain name: uno o più numeri, lettere, punti o trattini seguiti da un altro punto poi da due o sei lettere o punti. La sezione seguente è composta da files e directories opzionali. All'interno del gruppo vogliamo trovare la corrispondenza con ogni numero di barre, lettere, numeri, underscores, spazi, punti o trattini. Poi diciamo che il gruppo può essere individuato tante volte quante vogliamo. Praticamente questo consente più directories da abbinare insieme ad un file alla fine. Abbiamo usato la stella al posto del punto di domanda perché la stella dice zero o più, non zero o uno. Se avessimo usato un punto di domanda avremmo trovato corrispondenza con un solo file/directory.

Quindi è abbinata una barra rovesciata, da considerarsi facoltativa. Infine concludiamo con la fine della linea.

Stringa corrispondente:

https://net.tutsplus.com/about

Stringa non corrispondente:

http://google.com/some/file!.html (contiene un punto esclamativo)


7. Trovare corrispondenza con un indirizzo IP

Matching an IP addressMatching an IP addressMatching an IP address

Pattern:

1
    /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/
2
  

Descrizione:

Ora, non abbiamo intenzione di mentire, non abbiamo scritto questa espressione regolare; l'abbiamo presa da qui. Non significa che non possiamo sezionarla carattere per carattere.

Il primo gruppo di acquisizione non è davvero un gruppo acquisito perché

1
    ?:
2
  

è stato collocato all'interno per informare il parser di non considerare questo gruppo (informazioni maggiori nell'ultima regex). Vogliamo inoltre che questo gruppo non acquisito venga ripetuto tre volte — il {3} alla fine del gruppo. Questo gruppo contiene un altro gruppo, un sottogruppo, e un punto. Il parser cerca una corrispondenza nel sottogruppo e quindi un punto per procedere oltre.

Il sottogruppo è anche un gruppo non acquisito. È semplicemente un insieme di set di caratteri (cose all'interno di parentesi): la stringa "25" seguita da un numero tra 0 e 5; o la stringa "2" e un numero tra 0 e 4 e qualsiasi altro numero; o uno zero opzionale o uno seguito da due numeri, con il secondo opzionale.

Dopo averne cercati tre, è all'interno del prossimo gruppo non-acquisito. Questo vuole: la stringa "25" seguita da un numero tra 0 e 5; o la stringa "2" con un numero tra 0 e 4 e un altro numero alla fine; o uno zero opzionale o uno seguito da due numeri, con il secondo opzionale.

Concludiamo questa difficile espressione regolare con la fine della stringa.

Stringa corrispondente:

73.60.124.136 (no, non è il nostro indirizzo IP :P)

Stringa non corrispondente:

256.60.124.136 (il primo gruppo deve essere "25" e un numero tra zero e cinque)


8. Trovare corrispondenza con Tag HTML

Matching an HTML tagMatching an HTML tagMatching an HTML tag

Pattern:

1
    /^<([a-z]+)([^<]+)*(?:>(.*)<\/\1>|\s+\/>)$/
2
  

Descrizione:

Una delle regex più utili dell'elenco. Trova qualsiasi tag HTML con del contenuto all'interno. Come di consueto, cominciamo con l'inizio della linea.

Prima viene il nome del tag. Deve essere lungo una o più lettere. Questo è il primo gruppo acquisito, e torna utile quando dobbiamo selezionare il tag di chiusura. Seguono poi gli attributi del tag. Si tratta di qualsiasi carattere, ma un segno di maggiore (>). Dal momento che è opzionale, ma vogliamo trovare più di un carattere, viene utilizzata una stella. Il segno più costituisce l'attributo e il valore, e la stella comunica quanti attributi vogliate.

Viene poi il terzo gruppo non-acquisito. Dentro conterrà sia un segno di maggiore, del contenuto e un tag di chiusura; o dello spazio, una barra in avanti e un segno di maggiore. La prima opzione cerca un segno maggiore seguito da qualsiasi numero di caratteri, e il tag di chiusura. \1 viene utilizzato per rappresentare il contenuto che è stato catturato nel primo gruppo di acquisizione. In questo caso era il nome del tag. Ora, se non dovesse essere trovato dobbiamo cercare un tag che si auto chiude (come i tag img, br o hr). Questo necessita di avere uno o più spazi seguiti da "/>".

La regex si chiude con la fine della linea.

Stringa corrispondente:

Nettuts">http://net.tutsplus.com/">Nettuts+

Stringa non corrispondente:

<img src="img.jpg" alt="My image>" /> (gli attributi non possono contenere segni di maggiore)


Conclusione

Spero che vi siate fatti un'idea migliore di ciò che sta dietro le espressioni regolari. Si spera che userete queste espressioni regolari nei progetti futuri! Molte volte non avrete bisogno di decifrare un'espressione regolare carattere per carattere, ma se lo farete vi aiuterà a comprenderle meglio. Ricordate solo di non avere paura delle espressioni regolari, potrebbe non sembrare ma renderanno la vostra vita più semplice. Provate a tirare fuori il nome di un tag da una stringa senza espressioni regolari!

Seguiteci su Twitter o sottoscrivete l'iscrizione a NETTUTS RSS Feed per ulteriori articoli e tutorials giornalieri sullo sviluppo web. E controllate alcune di queste applicazioni regex sull'Envato Market.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.