Regulärer Ausdruck

23/04/2008 - 21:26 von Henning Eiben | Report spam
Hi,

ich will per Regex aus einem klassischen "domain\user" den Usernamen
ausschneiden. Soweit auch kein Problem, ein einfaches "^\w+\\(\w+)$"
sollte da ja für's erste funktionieren.

Also folgender kleiner Test:

public string RemoveDomain(string account) {
Regex _regEx = new Regex(@"^\w+\\(\w+)$", RegexOptions.IgnoreCase);
MatchCollection matchCollection = _regEx.Matches(account);
if (matchCollection.Count == 1)
return matchCollection[0].Value;
}

Ich würde nun Erwarten, dass ein Aufruf

string username = RemoveDomain(@"domain\user");

dazu führen würde, dass in "username" nun "user" drin steht - aber weit
gefehlt. Ein Blick in den Debugger verràt, dass nie ein Match gefunden
wird :( Interessanterweise beinhaltet die Variable "account" in der
Methode "RemoveDomain" auch den Wert "domain\\user" ... klar, aber wie
kann ich denn da am besten in meinem Regex drauf reagieren? Ich würde
dann erwarten, dass "username" den Wert "\user" enthàlt ...

Habe ich da irgendwo einen gravierenden Denkfehler?


Henning Eiben

busitec GmbH
Consultant

e-mail: eiben@busitec.de


+49 (251) 13335-0 Tel
+49 (251) 13335-35 Fax

Rudolf-Diesel-Straße 59
48157 Münster
www.busitec.de

Sitz der Gesellschaft: Münster
HR B 55 75 - Amtsgericht Münster
USt-IdNr. DE 204607833 - St.Nr. 336/5704/1277
Geschàftsführer: Simon Böwer, Henning Eiben, Stefan Kühn, Martin Saalmann



... There are 10 kinds of people. Those who know binary code, and those
who don't.
 

Lesen sie die antworten

#1 Gilles Kohl [MVP]
23/04/2008 - 22:15 | Warnen spam
On Wed, 23 Apr 2008 21:26:29 +0200, Henning Eiben wrote:

Hi,

ich will per Regex aus einem klassischen "domain\user" den Usernamen
ausschneiden. Soweit auch kein Problem, ein einfaches "^\w+\\(\w+)$"
sollte da ja für's erste funktionieren.

Also folgender kleiner Test:

public string RemoveDomain(string account) {
Regex _regEx = new Regex(@"^\w+\\(\w+)$", RegexOptions.IgnoreCase);
MatchCollection matchCollection = _regEx.Matches(account);
if (matchCollection.Count == 1)
return matchCollection[0].Value;
}

Ich würde nun Erwarten, dass ein Aufruf

string username = RemoveDomain(@"domain\user");

dazu führen würde, dass in "username" nun "user" drin steht - aber weit
gefehlt. Ein Blick in den Debugger verràt, dass nie ein Match gefunden
wird :( Interessanterweise beinhaltet die Variable "account" in der
Methode "RemoveDomain" auch den Wert "domain\\user" ... klar, aber wie
kann ich denn da am besten in meinem Regex drauf reagieren? Ich würde
dann erwarten, dass "username" den Wert "\user" enthàlt ...

Habe ich da irgendwo einen gravierenden Denkfehler?



- Bzgl: "domain\\user": Der Debugger führt Dich in die Irre - er zeigt Strings in C#-Syntax an, was Du als
Doppelbackslash siehst ist in Wirklichkeit nur einer.

- RemoveDomain scheint mir nicht vollstàndig zu sein, da fehlt das return wenn das if nicht greift - làsst sich das so
bei Dir übersetzen?

- Dein regulàrer Ausdruck trifft schon, und zwar den ganzen String. Du willst aber nur einen Teil des Ausdrucks, die
erste Gruppe (die Du ja auch geklammert hast), also:

return matchCollection[0].Groups[1].Value;

("Captures using () are numbered automatically based on the order of the opening parenthesis, starting from one. The
first capture, capture element number zero, is the text matched by the whole regular expression pattern.")

Viele Grüße,
Gilles.

Ähnliche fragen