Usare le Regular Expression in un progetto Foundation

Spesso capita di dover manipolare una stinga per trasformarla e le Regular Expression ci vengono in aiuto.

Su Instant Developer Cloud utilizzando come linguaggio il JavaScript le abbiamo già disponibili, mentre su Instant Developer Foundation le possiamo aggiungere.

Ma come facciamo?
Se esploriamo l’albero di un progetto Foundation e espandiamo la libreria del client (Client Library) troviamo qui tutte le funzioni per gestire il codice, gli operatori, le funzioni matematiche e di stringa e ogni funzione ha la sua definizione per le applicazioni compilate in Java o C#.
Per esempio la funzione Mid che esegue la substring di una stringa è fatta così:

Per aggiungere una funzione che faccia il replace di una stringa utilizzando le Regular Expression dobbiamo sapere quale funzione corrispondente utilizzare in C# e in Java e codificarla nell’albero del progetto.
Io per ora ho trovato quella che mi serve in C#, magari qualcuno di voi può cercare quella in Java.

Per aggiungere la funzione ReplaceRE occorre utilizzare il tasto destro sull’albero nella posizione dove vogliamo aggiungerla e poi selezionare Aggiungi funzione e impostare i parametri come segue.

La chiamata alla funzione nativa C# è questa:

new IDVariant(System.Text.RegularExpressions.Regex.Replace($1.stringValue(),$2.stringValue(),$3.stringValue()))

IDVariant() è la funzione che restituisce una variabile compatibile con quelle native di Instant Developer Foundation.

La nostra funzione ha tre parametri:

  • input - stringa di input su cui operare
  • pattern - regola da applicare
  • replacement - Stringa da utilizzare in sostituzione

Questo il primo parametro.

Vi allego un progetto di esempio che ha la funzione definita, così potete copiarla in un vostro progetto (è aggiornato anche con la versione di @d.termini del 24-giu-2024).

Regular Expression.zip (494,9 KB)

4 Mi Piace

Nel progetto allegato oltre alla definizione della funzione ReplaceRE() ho anche messo un esempio di utilizzo per eliminare i tag html da un testo.

Se ho questo testo:

"<div>Sono un Div</div><div>Sono un Div pure io</div>"

Con il pattern “<.*?>” sostituito con " " ottengo questo testo:

Sono un Div Sono un Div pure io

1 Mi Piace

Tempo fa usai le regex su un progetto Foundation .NET.
Per un buco della lib .NET, con un certa combinazione regola/stringa, l’applicazione andava in loop piantando il server in produzione.
Da quel dì, le ho evitate :wink: , ma è anche vero che probabilmente eravamo ancora in .NET 2.

1 Mi Piace

@r.bianco io le ho utilizzate solo con .NET 4 e non ho rilevato anomalie per il momento.
Hai ancora il pattern incriminato che lo proviamo?

Vero, sarebbe stata la cosa giusta da fare, ma è passato troppo tempo e non ne ho tenuto traccia.

Il problema capitava con qualche espressione regolare che mandava in loop il parser C# e dopo un po’ riavviava l’intero app pool su IIS
Da .NET 4.0 hanno aggiunto un parametro “timeout” per ovviare a questo problema, va ancora in loop ma può uscire dopo i secondi indicati in modo da non piantare tutto.
Regex.Replace Metodo (System.Text.RegularExpressions) | Microsoft Learn

Questo il codice da mettere nella funzione in libreria
new IDVariant(System.Text.RegularExpressions.Regex.Replace($1.stringValue(),$2.stringValue(),$3.stringValue(), System.Text.RegularExpressions.RegexOptions.None, new System.TimeSpan(0,0,0,0,500)))

A occhio esce dopo 500 millisecondi se va in loop o se comunque ci mette troppo

2 Mi Piace

Grazie @d.termini sei sempre sul pezzo.
Ho aggiornato il progetto di esempio che si può scaricare nell’articolo iniziale.

2 Mi Piace

Ho fatto anche la versione Match che restituisce un booleano (la sto usando per validare le password)
La funzione di libreria è simile (non ha il parametro replace) e come detto restituisce true se la stringa matcha con l’espressione, ovviamente non può gestire i casi di matching multiplo, quello sarebbe bello se qualcuno riuscisse a farlo.

Ecco il codice comunque:
new IDVariant(System.Text.RegularExpressions.Regex.Match($1.stringValue(),$2.stringValue(),System.Text.RegularExpressions.RegexOptions.None, new System.TimeSpan(0,0,0,0,500)).Success)

3 Mi Piace

Grazie ancora @d.termini appena ho un attimo la implemento e aggiorno l’esempio anche con questo.

1 Mi Piace

Ho aggiornato il progetto ed ora contiene anche la funzione MatchRE che verifica una stringa ed è corredata anche di esempio di controllo validità stringa con questo pattern:

^(?=.*[A-Za-z])(?=.*\d)(?=.*[@$!%*#?&])[A-Za-z\d@$!%*#?&]{8,}$

Che esegue questo controllo:
Minimo otto caratteri, almeno una lettera, un numero ed un carattere speciale

3 Mi Piace