Chi non è affatto a digiuno di informatica, probabilmente almeno una volta nella sua vita, è andato nel prompt di DOS ed avrà digitato un comando contenente anche una stringa con degli asterischi:
che vorrebbe dire "cancellami i file" (questo è il significato del comando del) che cominciano per "PIPPO" ed hanno estensione DOC. In tutta sincerità PIPPO*.DOC è una stringa che individua genericamente un'espressione regolare, dove espressione regolare è un modo per scrivere un'espressione stringa generica, a cui possono coincidere svariate stringhe. Sicuramente su Wikipedia trovate una definizione molto più accurata ed esaustiva.
Il mio problema, fino a pochi minuti fa, era riuscire a scrivere la medesima espressione regolare caratterizzata dagli asterischi in una espressione regolare accettata dall'oggetto System.Text.RegularExpressions.Regex. Se avete pertanto da trasformare il pattern PIPPO*.DOC, esso diventerà:
Alcuni altri esempio con una stringa generica, vi saranno utili per riconoscere altri pattern del tipo:
- pippo* (stringa che inizia per 'pippo') > ^(pippo)(.)*$
- *pippo (stringa che finisce per 'pippo') > ^(.)*(pippo)$
- *pippo* (stringa che contiene 'pippo') > ^(.)*(pippo)(.)*$
Sostanzialmente l'asterisco *, wild card di MS-DOS o del prompt a linea di comando di Unix o Windows, diventa (.)*, mentre tutte le altre porzioni di testo non dovete fare altro che metterle tra parentesi, in modo da identificare correttamente un blocco. A dirla tutta fino in fondo, questo non basterebbe ancora, perché dovreste evitare di utilizzare caratteri riservati nelle altre porzioni o dovreste prendervi la briga di convertire i simboli dei caratteri riservati nella maniera corretta in modo che essi siano accettati anche da Regex di .NET, ma per questo vi rimando ad altri articoli.
Un'ottima guida per le espressioni regolari in .NET la potete trovare anche qua su CodeProject.
Ecco la mia soluzione generale per assemblare il riconoscimento di una stringa generica:
Dim parts() As String
Dim i As Integer
Dim hasWildCard As Boolean
Dim re As System.Text.RegularExpressions.Regex
Dim reStr As String
Dim ANYTHING_STR As String = "(.)*"
' componiamo la stringa Regex
parts = Split(r, "*")
reStr = ""
For i = 0 To parts.Length - 1
If (i > 0) Then
reStr += ANYTHING_STR
End If
If (parts(i).Length > 0) Then
reStr += "(" + parts(i) + ")"
End If
Next
re = New System.Text.RegularExpressions.Regex("^" + reStr + "$")
Return re.Match(test).Success