Regular Expression
le R.E. cercano e/o sostituiscono caratteri in una stringa

  1. char matching: ricerca caratteri in una posizione
    • . qualunque carattere (uno solo, eccetto new line)
    • [rs] solo i caratteri r o s
    • [r-t] i caratteri da r a t
  2. rep matching: ricerca ripetuta
    • ? nessuna o una ricorrenza del carattere che precede
    • * nessuna o una o più ricorrenza del carattere che precede
    • () raggruppano i caratteri che precedono ? o *
  3. pos matching: posizione
    • ^ inizio
    • $ fine

da: view-source:http://www.aspcode.it/articoli/articoli.asp?act1=show_art&idx=60

"(\b(www\.|http\://)\S+\b)": come ti riconosco il link
di Antonio Paterno

Le funzioni seguenti accettano come parametro una stringa di testo e restituiscono in output la stessa stringa con gli eventuali URL e/o Email correttamente linkati. Anziché fare un'unica funzione che elaborasse sia gli URL (http:// o www. o entrambi) che gli indirizzi email, ho optato per 2 funzioni distinte (perché – ad esempio – potrebbe benissimo capitare che siamo interessati a linkare solo gli URL piuttosto che le email o viceversa). D'altra parte, volendo passare al setaccio sia gli URL che le email, basta un'istruzione del genere:

<%
Response.Write(LinkUrl(LinkEmail(stringa)))
%>

Ma ecco le due funzioni:

<%
Function LinkURL(stringa)
  Dim objRegExp, strTemp
  Set objRegExp = New RegExp

  objRegExp.IgnoreCase = True
  objRegExp.Global = True
  objRegExp.Pattern = "(\b(www\.|http\://)\S+\b)"
  strTemp = objRegExp.replace(stringa, "<A HREF='http://$1' TARGET='_new'>$1</A>")
  LinkURL = Replace(strTemp, "http://http://","http://")
  Set objRegExp = Nothing
End Function

Function LinkEmail(stringa)
  Dim objRegExp
  Set objRegExp = New RegExp

  objRegExp.Global = True
  objRegExp.IgnoreCase = True
  objRegExp.Pattern = "(\b[a-z._-]+@\S+\.[a-z]{2,3}\b)"
  LinkEmail = objRegExp.replace(stringa, "<A HREF='mailto:$1' TARGET='_new'>$1</A>")
  Set objRegExp = Nothing
End Function
%>

da: view-source:http://www.aspcode.it/articoli/articoli.asp?act1=show_art&idx=29

"\([0-9]{3}\)[0-9]{3}-[0-9]{4}": numeri di telefono

Questo è il formato internazionale:
(XXX)XXX-XXXX

Di solito, dovremmo procedere in questo modo: Ebbene (che ci crediate oppure no) noi possiamo impostare tutti questi controlli (e tutti gli altri che ci vengono in mente) semplicemente con una stringa di caratteri, il Pattern per l'appunto, in questo modo:

oRegExpr.Pattern = "\([0-9]{3}\)[0-9]{3}-[0-9]{4}"

Ma analizziamo questa "strana" stringa in dettaglio:
  1. "\(" --> vogliamo che il primo carattere sia una parentesi aperta (il carattere '\' o backslash è necessario in quanto la parentesi è uno dei caratteri speciali delle R.E. ed è il carattere cosiddetto "di raggruppamento". – vedi la 1ª lezione)
  2. "[0-9]{3}" --> poi ci devono essere 3 caratteri numerici compresi tra 0 e 9...
  3. "\)" --> ...poi la parentesi tonda chiusa...
  4. "[0-9]{3}" --> ...poi altri 3 caratteri numerici sempre compresi tra 0 e 9...
  5. "-" --> ...il trattino separatore...
  6. "[0-9]{4}" --> ...infine 4 caratteri di tipo numerico compresi tra 0 e 9.

<%
Function PhoneControl(stringa)
  Dim objRegExpr
  Set objRegExpr = New RegExp
  objRegExpr.Pattern = "\([0-9]{3}\)[0-9]{3}-[0-9]{4}"
  Dim colMatches
  Set colMatches = objRegExpr.Execute(stringa)
  PhoneControl = colMatches.Count
End Function

sCellulare = "(347)756-3412"
if PhoneControl(sCellulare) then
  Response.Write("numero di telefono corretto")
else
  Response.Write("numero di telefono non corretto")
end if
%>

da: http://www.aspcode.it/tips/tips.asp?act1=show_tip&idx=68

"\d": estrarre i numeri da una stringa

<%
Function GetNumber(stringa)
  Dim objRegExp, strTemp
  Set objRegExp = New RegExp
  objRegExp.IgnoreCase = True
  objRegExp.Global = True
  objRegExp.Pattern = "\d"
  Set Matches = objRegExp.Execute(stringa)
  For Each Match in Matches
    strTemp = strTemp & Match.Value
  Next
  Set objRegExp = Nothing
  GetNumber = strTemp
End Function
Response.Write(GetNumber("ccc567556hhg6"))
%>

Tra l'altro, cambiando il pattern in '\D', vengono estratti (al contrario) solo i caratteri alfabetici.

da: http://www.aspcode.it/articoli/articoli.asp?act1=show_art&idx=31

contare caratteri
Ecco un esempio "sui generis": diciamo che vogliamo calcolare il numero di segni 1, X e 2 in una colonna del Totocalcio (che ricordo è formata da 13 segni):

<%
Function QuantitaSegno(colonna, segno)
  Dim objRegExpr
  Set objRegExpr = New RegExp
  objRegExpr.Pattern = segno
  objRegExpr.IgnoreCase = TRUE
  objRegExpr.Global = TRUE
  Dim colMatches
  Set colMatches = objRegExpr.Execute(colonna)
  QuantitaSegno = colMatches.Count
End Function

strColonna = “x12xx21x222x1”
strSegno = “X”
Response.Write(“Tot. di segn X: ”& QuantitaSegno(strColonna, strSegno))
%>

La funzione restituirà 5 (ci sono infatti 5 segni x nella colonna).
Naturalmente basterà cambiare il valore di strSegno per calcolare il totale dei segni “1” e “2”.
Nell’esempio appena illustrato abbiamo introdotto due nuove proprietà dell’oggetto RegExpr (quelle scritte in grassetto): Altro esempio: e se volessimo sapere se una colonna contiene dei segni “X” consecutivi? (altro condizionamento statistico molto usato per “tagliare” ulteriormente il numero di colonne da mettere in gioco).
Ecco la relativa R.E. :

<%
Function IsCons(colonna, segno)
  Dim objRegExpr
  Set objRegExpr = New RegExp
  objRegExpr.Pattern = "("&segno&segno&")"
  objRegExpr.IgnoreCase = TRUE
  objRegExpr.Global = FALSE
  IsCons= objRegExpr.Test(colonna)
End Function

strColonna = “x12xx21x222x1”
strSegno = “X”

If IsCons(strColonna, strSegno) Then
  Response.Write(“La colonna contiene segni ”& strSegno&” consecutivi.”)
Else
  Response.Write(“La colonna non contiene segni ”& strSegno&” consecutivi.”)
End If
%>

Notate il nuovo metodo Test() dell’oggetto delle R.E. Il suo uso è molto intuitivo:questa funzione ha come argomento una stringa (in questo caso la nostra colonna Totocalcio) e ritornerà “Vero” se la stringa conterrà almeno 2 segni “X” consecutivi (come specificato nel Pattern). Altrimenti restituirà “Falso”.
Da notare inoltre come la proprietà Global sia stata settata a “Falso”:a noi interessa, infatti, che la R.E. termini di esaminare la colonna alla prima consecutività trovata (se questa – ovviamente – esiste).

Spero che abbiate apprezzato quest’uso alquanto “creativo” delle R.E. Questo era solo un piccolo assaggio di cosa è possibile fare con esse. D’altra parte, il presente articolo fa da “ponte” a (spero) futuri articoli che tratteranno la gestione di sistemi a pronostico (Lotto, SuperEnalotto et similia) Spero di aver stuzzicato la vostra curiosità . :-)
Arrivederci.