Regular expression

martedì 06 maggio 2008 - 13.47

skomed Profilo | Newbie

ciao a tutti..

non sono pratico di questo argomento e vorrei un pò di materiale da guardare a riguardo.Mi sapreste indicare qualcosa?

intanto vi chiedo il significato di una regular expressions di questo tipo :

@"\x26.{4}(?<Stato>[SE])"


grazie.

Brainkiller Profilo | Guru

>non sono pratico di questo argomento e vorrei un pò di materiale
>da guardare a riguardo.Mi sapreste indicare qualcosa?

E chi lo è ?

>intanto vi chiedo il significato di una regular expressions di
>questo tipo :
>@"\x26.{4}(?<Stato>[SE])"

Sai cosa ti consiglio, scaricati uno di questi due software o anche entrambi:

http://www.ultrapico.com/Expresso.htm
http://www.weitz.de/regex-coach/

copia e incolla quella Regular Expression all'interno ed eseguila. Entrambi i software te la sanno scomporre e dire che cosa significano i vari blocchi. Esempio ?<Stato> è una named capture, la sequnza .{4} significa prendi 4 caratteri qualsiasi, e così via. Tra l'altro Expresso nelle varie finestre ti fa vedere i vari simboli a cosa servono.

Non è un argomento certamente facile le Regex ma con questi tool ti agevoli la vita.
Ciao

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

skomed Profilo | Newbie

grazie mille... seguirò il tuo consiglio!

0v3rCl0ck Profilo | Guru

>ciao a tutti..
>
>non sono pratico di questo argomento e vorrei un pò di materiale
>da guardare a riguardo.Mi sapreste indicare qualcosa?

Potresti dare un occhio al mio blog, che tratta proprio questo argomento: http://blogs.dotnethell.it/regulator
Sono un po' indietro sul blog, ma ogni tanto qualcosa aggiungo

E poi puoi dare un occhio anche a questa guida referenziale: http://www.regular-expressions.info/reference.html

>
>intanto vi chiedo il significato di una regular expressions di
>questo tipo :
>
>@"\x26.{4}(?<Stato>[SE])"

\x26 è il caraterre ascii 38, cioè &
il punto significa che prende un qualsiasi carattere, escluso il ritorno a capo (vedi l'articolo sul mio blog)
{4} significa che il punto è ripetuto 4 volte, quindi prenderà 4 caratteri qualsiasi
(?<Stato>...) è un gruppo con nome, e ad esempio in .NET, è possibile leggerne il contenuto così: matchTest.Groups("Stato").Value
[SE] è un set di caratteri (vedi mio blog) e vuol dire che all'interno della parentesi (gruppo Stato) potrà esserci o la 'S' o la 'E'

Ad esempio questo testo &a1%fS verrebbe catturato dalla suddetta regex, perchè soddisfa tutti i requisiti.

>
>
>grazie.

Enjoy It

- Michael -
http://blogs.dotnethell.it/Regulator/

aiedail92 Profilo | Expert

Ciao

di materiale sulle regex se ne trova molto in rete. Prova ad esempio a guardare qui:

http://msdn.microsoft.com/it-it/library/system.text.regularexpressions.regex.aspx
http://msdn.microsoft.com/it-it/library/hs600312.aspx
http://msdn.microsoft.com/it-it/library/az24scfc.aspx

O su questo sito (in lingua inglese):

http://www.regular-expressions.info/

La Regex @"\x26.{4}(?<Stato>[SE])" esegue il match di un carattere ASCII avente codice esadecimale 26 (la & commerciale), seguito da un qualsiasi carattere che non sia un ritorno a capo (.) per esattamente quattro volte ({4}) seguito o da una S o da una E (maiuscole) ([SE]) che viene racchiusa in un gruppo di cattura denominato Stato ((?<Stato>)

Gli elementi del linguaggio di expressioni regolari sono svariati, coi link sopra trovi tutto ciò che serve per conoscere il motore Regex di .Net e le regex in generale.

Se hai ancora dubbi basta chiedere

Luca

skomed Profilo | Newbie

siete stati gentilissimi.. è abbastanza chiaro e posso approfondire meglio con i link che mi avete postato!

grazie ancora!!

skomed Profilo | Newbie


>Se hai ancora dubbi basta chiedere
>
>Luca


:) ecco ne approfitto :)

avrei bisogno di fare un lettura da un dispositivo dell'ultimo byte di un messaggio..

ho provato questa regular expression

@"\x25.{4}(?<Bcd>)"

quando mi intercetta il pacchetto il gruppo "Bcd" è sempre vuoto. Probabilmente il problema è che quel valore è un numero intero compreso tra 1 e 32 e mi fa la conversione ascii...ma io vorrei proprio quel valore come numero intero da poter memorizzare in una variabile int.


come si fa?

aiedail92 Profilo | Expert

Ciao

Il gruppo 'Bcd' resta sempre vuoto perchè non hai definito cosa deve catturare. Se volevi catturare il match di "\x25.{4}", devi inserirlo all'interno del gruppo:

@"(?<Bcd>\x25.{4})"

Questa regex fa il match del carattere Ascii avente 25 per codice esadecimale (carattere '%' ), seguito da quattro caratteri qualsiasi, e raggruppa il tutto nel gruppo denominato 'Bcd'

É questo che volevi?

Luca

skomed Profilo | Newbie

>Ciao
>
>Il gruppo 'Bcd' resta sempre vuoto perchè non hai definito cosa
>deve catturare. Se volevi catturare il match di "\x25.{4}", devi
>inserirlo all'interno del gruppo:
>
>@"(?<Bcd>\x25.{4})"
>
>Questa regex fa il match del carattere Ascii avente 25 per codice
>esadecimale (carattere '%' ), seguito da quattro caratteri qualsiasi,
>e raggruppa il tutto nel gruppo denominato 'Bcd'
>
>É questo che volevi?
>
>Luca


no... in base a quello che mi hai detto volevo una cosa di questo tipo :

@"\x25.{4}(?<Bcd>\d[1-32])"

sicuramente è sbagliato ma per farti capire forse può essere utile :P

in pratica devo avere un messaggio che inizia per %, poi 4 caratteri qualsiasi e infine un cbyte ( il cui valore voglio memorizzarlo in una variabile di tipo int )

esempio : %12345

nel gruppo bcd vorrei trovarmi 5... spero di essere stato chiaro.

inoltre ti chiedo un'altra piccola cosa.... nella regex il @ all'inizio cosa indica? e le " sono necessarie?

aiedail92 Profilo | Expert

La @ in C# viene anteposta ad una stringa per indicare che non devono essere considerate le sequenze di escape. Per cui la stringa @"\x\" equivale alla stringa "\\x\\" in quanto la '\' è il carattere di escape.

La regex è questa:

@"\x25.{4}(?<Bcd>3[012]|[012]?\d)"

Ci sono da dire un paio di cose: innanzitutto che la regex ammette anche lo 0, poi che vengono considerate anche i numeri come 01, 02 ecc. e infine che se viene trovato un numero maggiore di 32 viene comunque restituita la prima cifra del numero.

Ti allego un'immagine dove si vedono i risultati dei match:


476x276 32Kb


Luca

skomed Profilo | Newbie

>La regex è questa:
>
>@"\x25.{4}(?<Bcd>3[012]|[12]?\d)"
>


mi potresti spiegare il significato di [012]|[12]?\d....

cosi come è adesso non mi riceve il messaggio del tipo %00001


parlando dell'ultimo carattere ovvero quello da mettere nel gruppo Bcd quello che mi arriva è 1 byte :

00000001 e vorrei che Bcd fosse 1
00001010 --> Bcd =10

ho fatto due esempi....

anche se non la regex accetta valori superiori a 32 non importa...tanto è un vincolo posto gia dal dispositivo....non mi invia mai numeri superiori...

aiedail92 Profilo | Expert

"3[012]|[012]?\d" significa:

Prova a fare il match della regex che precede il '|' e se fallisce prova a fare il match di quella che segue. Quindi resta "divisa in due parti":

"3[012]" che significa "prendi un 3 seguito da uno 0, un 1 o un 2" (in pratica i numeri 30, 31, 32)

se questa fallisce, prova quest'altra:

"[012]?\d" cioè uno 0 o 1 o un 2, ripetuti zero o una volta, seguiti da una cifra decimale. Questa esegue il match di tutti i numeri fra 00 e 29, si che abbiano una sia che abbiano due cifre. Infatti se viene eseguito il match dello zero, dell'uno o del due ( "[012]?" ), dietro segue una cifra decimale, quindi il numero va da 00 a 29. Se invece non viene eseguito il match "[012]?" (il ? indica che il match può essere eseguito una volta o zero), segue una singola cifra decimale, quindi un numero da 0 a 9.

Ma forse a questo punto le regex non sono più la strada migliore da prendere...

Prova ad aprire un nuovo thread spiegando meglio la situazione, qui mi sembra che tu stia parlando di byte e codici binari, non più di stringhe...

Luca

skomed Profilo | Newbie

prima di aprirne uno nuovo ti chiedo un'ultima cosa ....

visto che mi arriva un byte 00000001 di questo tipo se ho capito bene in Bcd non potrei avere il carattere '1' ma il carattere SOH che è quello in ascii corrispondente al 1 decimale giusto???

a questo punto invece di fare dei controlli sul valore .. non potrei fare dei confronti con il rispettivo carattere ascii??

tipo if ( bcd=='SOH' ) text1.text="1"; e cosi via?

non guardare la sintassi che prob è sbagliata

aiedail92 Profilo | Expert

Puoi anche ottenere il valore decimale corrispondente al carattere ASCII col metodo Encoding.GetBytes, e quindi lavorare col byte:

byte bt = Encoding.ASCII.GetBytes("CarattereAscii")[0];

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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5