Esempio di Matching and Replacing attraverso Regex
INTRODUZIONE
Una Regular Expression (Regex) è una stringa/pattern che permette in modo compatto di rappresentare un insieme di stringhe, utilizzando precise regole sintattiche. Con le regex è possibile quindi cercare una determinata sequenza (pattern di rircerca) all'interno di un testo definendo una volta terminata la ricerca quali siano le azioni da eseguire su di essa. L' utilizzo delle regex viene consigliato qualora si vogliano effettuare operazioni di manipolazioni sulle stringhe;
ESEMPIO DI APPLICAZIONE REALE
Supponiamo di avere a che fare con delle stringhe xpath del tipo:
- ns0:Letter[1]/ns0:Customer[1]/ns0:Work[1]/ns0:Activity[1]/ns0:SubActivity[2]/ns0:Name[1]
- Letter[1]/Customer[1]/Work[1]/Activity[1]/SubActivity[2]/Name[1]
Il percorso xpath della prima stringa prevede un namespace ("ns0:"), mentre nel secondo non abbiamo nessun namespace. Supponiamo che data una di queste due stringhe si voglia aggiornare la stringa in modo che tutti gli indici numerici contenuti dentro le parentesi quadre vengano sostituiti con un indice numerico predefinito. Analizziamo come ciò sia possibile definendo la seguente funzione che si basa sull'utilizzo delle regex :
private string updateXPathAllExpression(string oldxpath, int index)
{
Regex regex = new Regex(@"/\w*:*\w*[[]*\d*[]]*");
Match match = regex.Match(oldxpath);
string xpath = null;
while (match.Success)
{
xpath += Regex.Replace(match.Value, @"[[]\d*[]]", "[" + index.ToString() + "]");
match = match.NextMatch();
}
return xpath;
}
Il pattern della prima regex può essere letto nel seguente modo:
- Matcha come primo carattere il carattere "/" ;
- Successivamente matcha un carattere che sia una parola ("\w") per un numero di volte che va da a zero a infinito ("*");
- Successivamente matcha il carattere ":" per un numero di volte che va da a zero a infinito ("*");
- Successivamente come nel punto 2 matcha un carattere che sia una parola ("\w") per un numero di volte che va da a zero a infinito ("*");
- Successivamente matcha il carattere "[": per un numero di volte che va da a zero a infinito ("[[]*");
- Successivamente matcha un numero ("\d") per un numero di volte cha va da zero ad infinito ("*");
- Concludi matchando il carattere "]": per un numero di volte che va da a zero a infinito ("[]]*");
Il pattern della seconda regex ha una struttura del tutto simile a quella della prima .
La funzione definita sopra riceve come parametri di ingresso la stringa da modificare e l'indice numerico da sostituire; sullla prima regex viene invocato il metodo Match utlizzato per effettuare i vari match all' interno della stringa xpath in ingresso; ottenuti i vari match della prima regex successivamente si cicla fino a che ci sono match con esito positivo, andando a ricostruirsi parte della stringa xpath finale effettuando il replacement dell'indice tramite il metodo Replace invocato sul valore del match corrente; La concatenazione successiva delle varie parti della stringa xpath effettuata sui valori dei match della regex permette di ricostruire la stringa xpath modificata;
RISORSE
http://www.regular-expressions.info/
http://www.regexbuddy.com/
Ad maiora....
indietro