Regex per trovare token

giovedì 14 febbraio 2008 - 14.43

aiedail92 Profilo | Expert

Ciao

Sto sviluppando un metodo che mi colora del testo quando trova un token valido; per farlo uso le regex.

Il problema arriva quando la regex fa il match di un carattere escaped.

Ora, io voglio che se un carattere è preceduto da un numero dispari (o pari a seconda della necessità) di \ quel carattere sia ignorato.

Ad esempio se voglio cercare tutte le occorrenze di una "(" ho bisogno che vengano ignorate quelle che hanno davanti una sola "\", ma prese quelle che ne hanno 2 (in quanto la prima \ rende la seconda escaped), ignorate quelle che ne hanno 3 ecc...

Spero di essere stato abbastanza chiaro...

Grazie a chiunque vorrà aiutarmi

Luca

bangirasu Profilo | Newbie

Metti la chiocciola davanti alle prime virgolette ;-)

using System.Text.RegularExpressions;
/*...*/
Regex rx = new Regex(@"^\($");
if(rx.IsMatch("(")) MessageBox.Show("match!");
else MessageBox.Show("doesn't match");

aiedail92 Profilo | Expert

Ciao

forse non mi sono spiegato bene

provo a chiarirmi con un esempio: ho una RichTextBox contenente questo testo:

((?#...) \((?#...) \\((?#...) \\\((?#...)

Ogni linea costituisce il pattern di una regex. Quindi nella prima linea la parentesi aperta è da intendersi come un gruppo di raccoglimento. Nella seconda, invece, poichè davanti alla prima tonda c'è una \, questa regex è da intendere come un "fai il match di una ("; nella terza riga davanti alla tonda c'è una barra, ma piochè davanti a questa barra ce n'è un'altra, la regex significa "fai il match di una \ e quindi crea un gruppo di raccoglimento", mentre nella quarta riga la regex significa "fai il match di una \ seguita da una ("

Adesso, per eseguire la colorazione della sintassi ho bisogno di colorare in un modo il gruppo di raccoglimento, e lasciare normale il testo letterale. Per farlo avevo pensato ad una regex contenente un lookbehind, che desse il match soltanto se il carattere (in questo caso "(") è preceduto da un numero pari di "\" (primo e terzo caso), e che lo ignorasse quando preceduto da un numero dispari, poichè le "\" si "annullano" a due a due, e la rimanente trasforma il carattere in un match letterale.

Purtroppo fin'ora usando solo le regex non sono riuscito a concludere niente ...

Luca

aiedail92 Profilo | Expert

Ciao

Sono riuscito a risolvere, posto la mia soluzione nel caso possa servire a qualcun'altro:

@"(?<=(?<!\\)(?:\\{2})*)\\r"

in questo modo trovo nel pattern di una regex tutti i "\r" che significano fai il match di un carriage return; quindi i "\r" preceduti da un numero pari di "\"

Luca
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5