Analisi del file di registro utilizzando l'espressione regolare

 C Programming >> Programmazione C >  >> Tags >> File
Analisi del file di registro utilizzando l'espressione regolare

In questo articolo parlerò dell'espressione regolare in C#. Userò l'espressione regolare per analizzare un file di testo di registro. Questo esempio lo sto usando per avere una migliore comprensione delle espressioni regolari. Inoltre indicherò i modelli più comunemente usati.

Cos'è un'espressione regolare?

Le espressioni regolari vengono utilizzate per identificare i modelli di carattere. L'espressione regolare può essere utilizzata per convalidare l'immissione di testo come password e numeri di telefono o per analizzare i dati testuali in un formato più strutturale.

Dobbiamo usare la classe Regex presente nello spazio dei nomi System.Text.RegularExpressions.

Una delle espressioni regolari più comuni è un quantificatore(?). Corrisponde all'elemento precedente 0 o 1 volta. Un elemento è un singolo carattere o una struttura di caratteri tra parentesi quadre.

Nel codice seguente sto cercando 0 o 1 occorrenza del carattere 'e' nella stringa.

            Console.WriteLine(Regex.Match("Developer", "Develope?r").Success); //true
            Console.WriteLine(Regex.Match("Developr", "Develope?r").Success);//true
            Console.WriteLine(Regex.Match("Developeer", "Develope?r").Success);//false

Regex.Match cerca all'interno di una stringa più grande. Restituisce un oggetto Match che ha proprietà Success, Index, Length e value.

Possiamo usare la classe Regex per dividere una stringa. Si prega di vedere l'esempio qui sotto.

Osservando l'esempio sopra puoi dire che possiamo usare la funzione string.Split per dividere la stringa per spazio. Ma cosa succede se devi dividere il testo supponendo un numero.

            Regex match = new Regex(@"\d");
            string name = "Vikram1Chaudhary2C#3Developer";
            string[] words = match.Split(name);
            Console.WriteLine(string.Join(",", words));

Il codice precedente restituirà l'array di stringhe contenente "VIkram", "Chaudhary", "C#", "Developer".

Analisi di un file di testo.

L'argomento delle espressioni regolari è molto vasto. Ed è difficile dare l'esempio per tutti i caratteri speciali in un articolo. Ecco perché tratterò la maggior parte dei concetti in un esempio. Qui analizzerò il file di registro che scriviamo per le nostre applicazioni a scopo di debug.

Una delle righe per il file di registro può essere quella mostrata di seguito

"ERRORE 6/12/2016 01:25:15 —MyModule— NullReferenceException generato da MyMethod in MyCLass"

Dove la prima parte è il livello di errore che può essere uno tra ERRORE, INFO, AVVISO ecc. La parte successiva è il timestamp seguito dal nome del modulo e dall'eccezione dettagliata.

Il codice per analizzare il file di registro è come mostrato di seguito.

            string SampleLine = "ERROR 12/6/2016 01:25:15 ---MyModule--- NullReferenceException thrown by MyMethod in MyCLass";

            Regex pattern = new Regex(@"(?\S+) " +
                @"(?\d{2}/\d{1,2}/\d{4} \d{2}:\d{2}:\d{2}) " +
                @"---(?[^-]+)--- " +
                @"(?.*)");

            Match match = pattern.Match(SampleLine);
            if(match.Success)
            {
                Console.WriteLine(match.Groups["level"]);
                Console.WriteLine(match.Groups["timestamp"]);
                Console.WriteLine(match.Groups["category"]);
                Console.WriteLine(match.Groups["message"]);
            }

Qui tratterò tutte le parti dell'espressione regolare usata sopra.

  1. (?<>)         L'espressione viene utilizzata per acquisire il  gruppo denominato.
  2. \S+            Questa espressione viene utilizzata per acquisire una o più sequenze di caratteri non di spazio vuoto.
  3. \d{2}          Questa espressione viene utilizzata per acquisire il numero a due cifre.
  4. \d{1,2}       Acquisisce il numero a una o due cifre.
  5. [^-]+          Cattura le stringhe che non contengono una o più occorrenze di '-' char.
  6. .*               Cattura zero o più occorrenze di qualsiasi carattere senza newline.

Nell'espressione regolare sopra otteniamo i quattro nomi dei gruppi livello, timestamp, categoria e messaggio. Alla riga n. 9 otteniamo i valori di questi gruppi, se siamo in grado di analizzare correttamente la stringa.

Un rapido riferimento per i modelli di esempio

Di seguito troverai un rapido riferimento per i modelli di espressioni regolari.

.    Any character except newline.
\.   A period (and so on for \*, \(, \\, etc.)
^    The start of the string.
$    The end of the string.
\d,\w,\s A digit, word character [A-Za-z0-9_], or whitespace.
\D,\W,\S Anything except a digit, word character, or whitespace.
[abc]  Character a, b, or c.
[a-z]  a through z.
[^abc] Any character except a, b, or c.
aa|bb  Either aa or bb.
?      Zero or one of the preceding element.
*      Zero or more of the preceding element.
+      One or more of the preceding element.
{n}    Exactly n of the preceding element.
{n,}   n or more of the preceding element.
{m,n}  Between m and n of the preceding element.
(expr) Capture expr for use with \1, etc.
(?:expr) Non-capturing group.
(?=expr) Followed by expr.
(?!expr) Not followed by expr.

Conclusione

In questo articolo ho cercato di coprire le basi dell'espressione regolare. Inoltre abbiamo visto come possiamo usare l'espressione regolare per dividere la stringa o analizzare un file di testo.