Trasformare il file matching del prompt di DOS in regular expression .NET
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
Nessun commento trovato.
Disclaimer L'indirizzo IP del mittente viene registrato, in ogni caso si raccomanda la buona educazione.
|