\\ Home Page : Articolo : Stampa
Trasformare il file matching del prompt di DOS in regular expression .NET
Di Marco Tenuti (del 16/12/2008 @ 09:31:55, in informatica, linkato 1639 volte)

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:

  • del PIPPO*.DOC

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à:

  • ^(PIPPO)(.)*(.DOC)$

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