"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

[C#] GUID RegEx-Match aus String

.dcp 29.05.2009 - 10:55 2789 14
Posts

.dcp

notamodbuthot
Avatar
Registered: Jul 2002
Location: new
Posts: 8881
will eine GUID in einem string finden. solang der string allein ne GUID ist klappts, aber nicht, wenn davor oder dahinter noch zeichen stehen.

Code:
Regex RE = new Regex("^((?-i:0x)?[A-Fa-f0-9]{32}|[A-Fa-f0-9]{8}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{12}|{[A-Fa-f0-9]{8}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{12}})$");

                            MatchCollection ReMatches = RE.Matches(content);
                            if (ReMatches.Count > 0)
                            {
                                foreach (Match m in ReMatches)
                                {
                                    //do sumthin with it
                                }
                            }

string content ist immer eine zeile aus einer (text-)datei.

bei "{936DA01F-9ABD-4d9d-80C7-02AF85C822A8}"
und "936DA01F-9ABD-4d9d-80C7-02AF85C822A8"
gibts ein match, bei
"blabla{936DA01F-9ABD-4d9d-80C7-02AF85C822A8}blubb"
aber nicht...halp?! ;)

tia,
.dcp
Bearbeitet von .dcp am 29.05.2009, 11:10

Hansmaulwurf

u wot m8?
Avatar
Registered: Apr 2005
Location: VBG
Posts: 5639
Wenn das ein "oder" sein soll, dann fehlt dir ein | ;)

edit:/ crap, ne das kanns nicht sein..
Ich hasse Regex, verwirren mich immer..

.dcp

notamodbuthot
Avatar
Registered: Jul 2002
Location: new
Posts: 8881
die regex hab ich auch nur aus einem anderen projekt gecopypasted, daher hab ich keine ahnung, wo ich ein | einfügen soll ;)
aber solange der ganze string eine GUID ist, funktionierts ja auch, aber er soll auch ein match finden, wenn die GUID von anderen zeichen umgeben ist.

edit: :D geht mir genauso.

siddhartha

Bloody Newbie
Registered: Apr 2007
Location: Austria
Posts: 4
Wenn du das ^ und das $ in deinem RegEx wegbaust, dann sollte es funktionieren. Diese Zeichen stehen für den Anfang und das Ende eines Strings, wenn also davor bzw. danach noch was kommt, kann er nichts finden.

Hoffe, ich konnte dir weiterhelfen.

COLOSSUS

Administrator
Frickler
Avatar
Registered: Dec 2000
Location: ~
Posts: 11890
Bitte poste ein Beispiel fuer einen (oder besser zwei) tatsaechliche Nicht-Matches, die du gerne gematcht haettest.

Ich kenne mich in der Win32-Welt nicht so gut aus - kann es ueberhaupt vorkommen, dass so eine GUID ohne literale { und } an Anfang und Ende auftritt?

quilty

Ich schau nur
Avatar
Registered: Jul 2005
Location: 4202
Posts: 2925
Wie siddhartha schon richtig gesagt, gehören nur die 2 Zeichen weg und es sollte funktionieren.

Entsprechender MSDN Link.

.dcp

notamodbuthot
Avatar
Registered: Jul 2002
Location: new
Posts: 8881
danke, hab ich mittlerweile auch durch probieren rausgefunden ;)

Code:
[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}

die passt nur auf die GUID ohne { und }.
@colo: genaue anforderungen hab ich noch nicht, wie so oft, wenn "mal eben was zwischendurch" gebraucht wird ;)

vanHell

Tauren Marine
Registered: May 2004
Location: Hell
Posts: 1017
Mit dem Regexp

Code: PHP
.*([0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}).*

matcht er jede Zeile die einen GUID enthält, dann kanst mit m.Groups die Groups auslesen und in der ersten Group sollte dann nur der GUID stehn ohne klammern oder sonst irgendwas.

COLOSSUS

Administrator
Frickler
Avatar
Registered: Dec 2000
Location: ~
Posts: 11890
Die .* am Anfang und Ende kann man sich schenken, wenn der Match eh zeilenweise passiert. Und statt [0-9a-fA-F] kann man laut POSIX auch [[:xdigit:]] schreiben, wenn einem das besser gefaellt. Das sollte speziell in diesem Fall mit den literalen Hyphens in der RE zur Lesbarkeit beitragen koennen.

vanHell

Tauren Marine
Registered: May 2004
Location: Hell
Posts: 1017
C# und POSIX passen aber irgendwie garned zusammen oder?

COLOSSUS

Administrator
Frickler
Avatar
Registered: Dec 2000
Location: ~
Posts: 11890
Naja, die meisten RegEx-Libraries (egal welcher Programmiersprachen) lehnen sich entweder an POSIX RE, POSIX ERE, oder PerlCRE an. Alle drei Dialekte verstehen sich auf diese "POSIX Character Classes". Wenn es das also in irgendeiner Sprache/RE-lib nicht gibt, ist das imo als Bug zu reporten ;)

Nur weil ein System als Ganzes nicht vollstaendig POSIX-konform ist, heiszt das nicht automatisch, dass es nicht trotzdem Teile von POSIX implementiert.

vanHell

Tauren Marine
Registered: May 2004
Location: Hell
Posts: 1017
Zitat von COLOSSUS
Naja, die meisten RegEx-Libraries (egal welcher Programmiersprachen) lehnen sich entweder an POSIX RE, POSIX ERE, oder PerlCRE an. Alle drei Dialekte verstehen sich auf diese "POSIX Character Classes". Wenn es das also in irgendeiner Sprache/RE-lib nicht gibt, ist das imo als Bug zu reporten ;)

Bei einer 3rd Party library würd ich dir recht geben. Aber bei den Regex Classen die beim .Net framework dabei sind intressiert das sicher keinen und Microsoft sicher am allerwenigsten. Eigentlich kann man froh sein das sie die wirklich wichtigen sachen ned neu erfunden haben.

COLOSSUS

Administrator
Frickler
Avatar
Registered: Dec 2000
Location: ~
Posts: 11890
Du scheinst recht zu haben. Zumindest finde ich hier nichts Entsprechendes:
http://msdn.microsoft.com/en-us/library/20bw873z.aspx

Tjo, dumm gelaufen. Wenn man bedenkt dass sie jeden moeglichen Shit da reingeworfen haben (IsGreekandCoptic - wtf?), haetten die alnum, alpha, print, digit, xdigit und Co. auch nicht geschadet. Wenn Hanlon's Razor nicht waere, wuerde ich ihnen ja unterstellen, dass das aufgrund irgendeiner obskuren, boeswilligen Absicht gemacht wurde ;)

jives

And the science gets done
Avatar
Registered: Sep 2001
Location: Baden
Posts: 3548
Zitat von COLOSSUS
Wenn Hanlon's Razor nicht waere, wuerde ich ihnen ja unterstellen, dass das aufgrund irgendeiner obskuren, boeswilligen Absicht gemacht wurde ;)
:D Wie so oft bei MS-"Lösungen"...

corny

Little Overclocker
Avatar
Registered: Sep 2004
Location: Austria
Posts: 98
man kann auch nicht alles haben :(
Bearbeitet von corny am 31.05.2009, 11:08
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz