Laden...
W
webstarg myCSharp.de - Member
München, Deutschland Dabei seit 21.07.2006 558 Beiträge
Benutzerbeschreibung

Forenbeiträge von webstarg Ingesamt 558 Beiträge

01.08.2007 - 20:03 Uhr

Original von webstarg

Original von LastGentleman

Ein Vorteil von VirtualPC: Es ist zur Zeit das einzige (kostenlose) Virtualisierprogramm, in welchem (laut CHIP) nicht erst ein Betriebssystem installiert werden muss, da man auch schnell ein Image des aktuellen Systems machen und das in VirtualPC verwenden kann (also Installation bzw. Zustand des "richtigen" PCs als Ausgangslage).

Wie geht denn das, finde dafür keinen Punkt?

Es ist ein eigenes kleines Programm. Namen habe ich gerade nicht bei der Hand, ich poste ihn morgen.

webstarg

Ups, hab mich getäuscht. Das war bei VMWare (nicht bei VirtualPC). Es geht mit der Freeware "Live-View".

mfg
webstarg

01.08.2007 - 19:58 Uhr

Original von katarch
Es gibt ein wunderbares
>
über das Thema. Lohnt sich.

Danke Katarch. 🙂

mfg
webstarg

31.07.2007 - 22:13 Uhr

Anregung: Wenn man statt Runden Buchstaben (= keine gültige Zahl) eingibt, dann, denke ich mal, stürzt dein Programm ab.

Bitte jetzt aber nicht einen Thread aufmachen und fragen, wie man das bewerkstelligt.

Galileo Openbook oder Forensuche oder Google.

mfg
webstarg

31.07.2007 - 22:04 Uhr

Hallo!

Dazu gibt es bereits sehr viele Threads.

--> Forensuche

mfg
webstarg

31.07.2007 - 21:49 Uhr

Hallo sepp_a_u,

wie dir von anderen bereits mitgeteilt wurde, empfehle auch ich dir, Console.ReadLine() anstatt Console.Read() für das Einlesen der Rundenanzahl zu verwenden. Was, wenn der User 10 Runden (oder jede andere Zahl, die mehr als 1 Stelle hat) spielen möchte?

Oh, jetzt verstehe ich erst das Problem. 8o

Nimm das ToString() raus; dort wo du es hingegeben hast ist es total sinnlos. Es wandelt 0 (ist der enthaltene Wert der Variable runden) zu "0" um, verwendet den Rückgabewert aber nicht.

Die Zeile runde = Console.Read(); ersetzt du mit Convert.ToInt32(Console.ReadLine());
(Oder mit der Methode Int32.Parse oder TryParse oder was auch immer).

Unterschied: Console.Read() speichert den Index des eingegebenen Zeichen in deine int-Variable. Und 1 ist anscheinend auf Index 49.
Mit Convert.ToInt32(...:
Das wird von innen nach außen abgearbeitet: Zuerst wird die Zeile, die der Benutzer geschrieben hat, eingelesen, dann wird sie zum Typ Int umgewandelt und dann in die Variable gespeichert.

(btw: Console.Read() liest ein Zeichen ein, Console.ReadLine() eine ganze Zeile (bzw. bis der User Enter drückt))

Auch Grundlagen...

grüße
webstarg

31.07.2007 - 21:21 Uhr

Das ASCII-Problem tritt nicht auf, wenn du einen String (anstatt eines Char) in eine Zahl konvertierst. Füge vor der Zu-Int-Konvertierung also noch .ToString() ein und es müsste klappen (wenn ich das Problem richtig verstanden habe).

mfg
webstarg

31.07.2007 - 19:54 Uhr

Für die Cursorposition gibt es die Property Cursor (auch bei TextBox).

webstarg

31.07.2007 - 17:54 Uhr

weiß nicht ob du das meinst...


public void CopyCheckedTreeNodesIntoSomewhere(TreeNodeCollection tnc)
{
  foreach (TreeNode tn in tnc)
  {
    if (tn.Checked)
    {
      // Dieser tn ist "gechecked"
    }
    if (tn.Nodes != 0)
    {
      //rekursiv für Children aufrufen
      this.CopyCheckedTreeNodesIntoSomewhere(tn);
    }
  }
}

So ungefähr müsste es gehen, nicht getestet!

webstarg

[Edit]Geschwungene Klammer verschoben; Code etwas eingerückt.[/Edit]

31.07.2007 - 17:44 Uhr

Vor dem Aufruf der Methode ShowDialog könnte man den Zustand der CheckBox überprüfen, jedoch hat sie dann immer den Standardwert, wenn Sie vorher noch nicht aufgerufen und verändert wurde.


Form1 frm1 = new Form1();
frm1.ShowDialog();

//Benutzer verändert CheckBox

//... Programm macht etwas

if (frm1.checkBox1.Checked)
{
frm1.ShowDialog();
}

Ob das aber sinnvoll ist, ...

mfg
webstarg

31.07.2007 - 17:22 Uhr

Dieses Event übergibt die ClosingEventArgs-Property e.

e.Cancel auf true setzen und deine Form wird nicht geschlossen.

mfg
webstarg

30.07.2007 - 21:55 Uhr

Wenn es keine Eigenschaft dazu gibt (was ich glaube), musst du die Linie selbst zeichnen.

30.07.2007 - 21:46 Uhr

Muss das leider nochmal ausgraben...

@ herbivore:
Negativ.

@ ldr:
Funktioniert auch nicht. (Habe in meinem Fall umgeformt zu: Tahoma; 9pt; style=Bold)

Weiß niemand wie das geht?
Es würde halt ziemlich viele Codezeilen ersparen...

mfg
webstarg

30.07.2007 - 19:43 Uhr

Original von michlG
if(eingabe=1 && zufallszahl=2)
Console.WriteLine("Der Computer hat gegen dich gewonnen");
else if(eingabe=1 && zufallszahl=3)
Console.WriteLine("Du hast gegen de Computer gewonnen");
else if(eingabe=1 && zufallszahl=1)
Console.WriteLine("Unentschieden");
else if(eingabe=2 && zufallszahl=1)
Console.WriteLine("Du hast gegen den Computer gewonnen");l

@ michlG:

  • In Zukunft bitte Codetags (csharp) (in eckigen Klammern) benutzen.

if ((eingabe==1) && (zufallszahl==2))
{
}
else if ...

Unterschied **== **und =
== zum Vergleichen
= zum Zuweisen

mfg
webstarg

30.07.2007 - 19:37 Uhr

Original von sepp_a_u
und wie mache ich da void rein? wenn ich da void reinmache kommt immer eine fehlermeldung 😦

Sicher kommt dann eine Fehlermeldung. Weil du vergessen hast "return 0;" herauszunehmen.

webstarg

[Edit]
PS: [Hinweis] Wie poste ich richtig? Punkt 5
[/Edit]

30.07.2007 - 19:31 Uhr

Hallo sepp_a_u,

solche Sachen sind ziemlich grundsätzliche Sachen, die man sich am besten anhand eines Buches erarbeitet. Dies wird in diesem Forum auch erwartet. (Links im Forum unter der Überschrift Resourcen findest du einige Links, mit welchen du dir dieses Wissen aneignen kannst.)

wie kann ich jetzt ne abfrage reinmachen, die überprüft, was der spieler eingegeben hat und was der pc ausgewählt hat? und wie kann ich das dann vergleichen damit ich seh wer gewonnen hat?

if-Abfrage (Verzweigung) oder switch-case

PS: In C# (im Ggs. zu C++) ist es üblich, dass die Main-Methode void als Rückgabewerttyp hat.

mfg
webstarg

30.07.2007 - 19:11 Uhr

Laut MSDN macht die List.Remove-Methode folgendes:

Removes the first occurrence of a specific object from the List.

Also ist dein erstes Element schon das 1. Auftreten? (Das könntest du mal mit List.IndexOf überprüfen (gibt dir den Index eines Elements in der List zurück))

Falls du den Index hast, kannst du List.RemoveAt(int index) verwenden.

mfg
webstarg

30.07.2007 - 19:08 Uhr

Zufallszahlen: Klasse **Random **(Namespace: System)

int meineZufallszahl = new Random().Next(1,4);

Solche Sachen würde man aber auch in der MSDN oder bei Google finden. 8)

mfg
webstarg

30.07.2007 - 17:52 Uhr

Du meinst eher den Scrollbalken, oder?

Dann ist die Lösung von winSharp93 zutreffend.

webstarg

30.07.2007 - 17:49 Uhr

Hallo eleftro,

unter "vertikaler Balken" stelle ich mir vor, dass du den Cursor meinst.

-> myTextBox.Cursor

mfg
webstarg

30.07.2007 - 17:11 Uhr

Original von Rainbird
Der richtet einen Drucker ein, der anstatt zu drucken PDF-Dateien ausgibt.

Wobei diese Arten von PDF-Erstellprogrammen das Problem haben, dass Links nicht mehr anklickbar sind, sondern nur noch als blau-unterstrichener Text dargestellt werden.

mfg
webstarg

30.07.2007 - 16:05 Uhr

Hallo Ulf#,


private void listView1_SelectedIndexChanged(object sender, EventArgs e)
        {
          
                strApplicationID = listView1.SelectedItems[0].Text;
                strApplicationName = listView1.SelectedItems[0].SubItems[1].Text; //Fehler war hier!

        }

mfg
webstarg

30.07.2007 - 16:03 Uhr

Wenn es nicht nur die Schriftart als Formatierung sein soll, interessiert dich vielleicht auch FontDialog.

webstarg

30.07.2007 - 16:00 Uhr

Original von LastGentleman

Ein Vorteil von VirtualPC: Es ist zur Zeit das einzige (kostenlose) Virtualisierprogramm, in welchem (laut CHIP) nicht erst ein Betriebssystem installiert werden muss, da man auch schnell ein Image des aktuellen Systems machen und das in VirtualPC verwenden kann (also Installation bzw. Zustand des "richtigen" PCs als Ausgangslage).

Wie geht denn das, finde dafür keinen Punkt?

Es ist ein eigenes kleines Programm. Namen habe ich gerade nicht bei der Hand, ich poste ihn morgen.

webstarg

29.07.2007 - 21:12 Uhr

Ich benutze VirtualPC. Stabil, aber etwas träge (bei P4 550 @ 3,40 GHz, 1 GB RAM).
Grafisch wird eine 8-MB-Karte simuliert.

Ein Vorteil von VirtualPC: Es ist zur Zeit das einzige (kostenlose) Virtualisierprogramm, in welchem (laut CHIP) nicht erst ein Betriebssystem installiert werden muss, da man auch schnell ein Image des aktuellen Systems machen und das in VirtualPC verwenden kann (also Installation bzw. Zustand des "richtigen" PCs als Ausgangslage).

mfg
webstarg

29.07.2007 - 21:05 Uhr

Achso, ok. 🙂

Ich habe geglaubt, die Datenbankanbindung funktioniert nicht oder es wurde ein falscher Dateipfad angegeben.

mfg
webstarg

29.07.2007 - 19:35 Uhr

Hallo LukeGee,

ich habe leider Probleme bei der Benutzung deines Programms.

Die Installation habe ich in C:[Ordnername deines Programms] ausgeführt; eine Datenbank-Datei ist dort vorhanden.

Beim Öffnen deines Programmes und anschließendem Klick auf Lernen, passiert bei jeder Unit "Keine Variablen geladen". Auch wenn ich das Programm nicht aus dem Startmenü, sondern direkt von C:[Ordner][Programm].exe aus starte habe ich das selbe Problem.

mfg
webstarg

29.07.2007 - 14:11 Uhr

Vielen Dank!

Habe ich ausgebessert.
webstarg

(Neuer Pattern zu Übung 6: ^[b-df-hj-np-tv-z]*$)

29.07.2007 - 14:02 Uhr

Hallo preli,

ich hätte evtl. Interesse.

  • Soll das ein WYSIWYG-Editor werden?
  • Homepages mit welcher Programmiersprache?

mfg
webstarg

29.07.2007 - 13:59 Uhr

Ok, dankeschön.

(Ja, ich meinte in der SharpDevelop-Source.)

mfg
webstarg

28.07.2007 - 20:43 Uhr

Tutorial zu Regex

[Aktuelle BBC-Code-Version]

1. Was ist Regex?
**Regex **ist die Abkürzung für **„Regular Expressions“, **zu Deutsch: „Reguläre Ausdrücke“.
Es ist eine Zeichenkette, die der Beschreibung von Mengen beziehungsweise Untermengen von Zeichenketten mit Hilfe bestimmter syntaktischer Regeln dient. (Wikipedia)

Regex ist ein mächtiges Mittel zum Validieren und Bearbeiten von Zeichenketten.

2. Verwendung von Regex in C#
Um Regex in einem C#-Programm nutzen zu können, muss zunächst der Namespace System.Text.RegularExpressions eingebunden werden.
Dies geschieht, indem wir vor die Klasse

using System.Text.RegularExpressions;

schreiben.

Getestet werden können diese Ausdrücke, indem wir zunächst eine Instanz von Regex erstellen:

Regex myRegex = new Regex([Pattern]);

Unter **Pattern **versteht man das Muster, nach welchem die Zeichenfolgen überprüft werden sollen. Das Pattern kann beispielsweise beschreiben, dass nur Zeichen von A – Z verwendet werden dürfen. Oder alle Buchstaben des Alphabets, Zahlen sowie der Strichpunkt. Anstelle von [Pattern] übergeben wir dem Konstruktor das Muster.
Um Zahlen zuzulassen, wäre folgendes Pattern geeignet: ^[0-9]*$
Auf die Zeichenfolgen werde ich aber später noch näher eingehen.

Anmerkung: Es empfiehlt sich, vor dem einleitenden Anführungszeichen des Pattern-Strings ein @-Zeichen zu setzen. Dies bewirkt, dass im String vorkommende Anführungszeichen und Backslash weniger verwirrend angegeben werden können. Anführungszeichen verdoppelt man (ohne Verwendung von @ vor dem String müsste man \“ für die Verwendung des Anführungszeichen schreiben), Backslash können normal angegeben werden (wenn ohne @ doppelt: \). (Dies trifft nicht zu, wenn das Pattern zur Laufzeit definiert wird (z. B. Eingabe des Patterns in ein Textfeld während das Programm ausgeführt wird).)

Die Instanz von Regex generieren wir folgendermaßen:

Regex myRegex = new Regex(„^[0-9]*$”);

Um eine Zeichenfolge, die in textBox1 steht, nach diesem Muster zu überprüfen, wäre folgende Befehlszeile von Nöten:

bool bedingungWahr = myRegex.IsMatch(textBox1.Text);

3. Funktionen von Regex
Die Klasse Regex bietet folgende Möglichkeiten:
Methode: Match
o String nach einem Vorkommen des regulären Ausdrucks (Pattern) durchsuchen und eine Extrahierung des getroffenen Textteils aus der Eigenschaft Match.Value auslesen
o Rückgabewerttyp: Match

Methode: Matches
o String nach allen Vorkommen des regulären Ausdrucks durchsuchen
o Rückgabewerttyp: MatchCollection

Methode: IsMatch
o String auf Gültigkeit bezüglich eines Musters überprüfen
o Rückgabewerttyp: Bool

Methode: Replace
o Zeichenfolgen in einem String ersetzen
o Rückgabewerttyp: String

Methode: Split
o Zum Splitten (Aufteilen) eines String
o Rückgabewerttyp: String[]

Anmerkung: Zu jeder Methode gibt es mehrere Überladungen. So kann beispielsweise mit RegexOptions.IgnoreCase angegeben werden, dass zwischen Groß- und Kleinschreibung nicht unterschieden wird. Bitte beachten Sie, dass wenn diese Regex-Option nicht eingestellt ist, zwischen Groß- und Kleinschreibung unterschieden wird.

In diesem Tutorial werde ich hauptsächlich auf die Syntax von Regex eingehen und mich auf die IsMatch-Methode beziehen.

Damit beim Üben nicht bei jeder Änderung des Patterns das gesamte Programm neu kompiliert werden muss, kann man sein Pattern mit Hilfe von On-the-fly-Testprogrammen testen:
So gibt es das Programm Regex-Lab (On-the-fly-Regex-Tester) kostenlos zum Herunterladen.
Das Programm Espresso (engl.) analysiert reguläre Ausdrücke und stellt diese strukturiert dar.
Wer an einem Computer ohne installiertem .NET-Framework ist, kann Regex auf meiner Seite ausprobieren: http://odwn.brinkster.net/regex.aspx

4. Syntax von Regex
Wieso beschreibt die Zeichenfolge ^[0-9]*$ als Pattern, dass nur Ziffern als gültige Zeichen anerkannt sind?

Kommen wir zur Syntax von Regex, mit welcher das Muster beschrieben werden kann.

4.1 Einfachstes Pattern
Auch ein Wort oder ein Zeichen ist bereits ein gültiges Pattern (Muster). So erlaubt das Beispiel-Pattern Zeichen unter anderem „Zeichen“, „Zeichenfolge“, „DruckZeichen“, „Westliche Zeichenkodierung“ usw. Alle Strings, die dieses Wort enthalten, liefern bei der Validierung mit diesem Pattern eine positive Rückantwort.

4.2 Patternbeginn und -Ende
Das Zeichen ^ kennzeichnet, wenn es zu Beginn des Patterns steht, dass der zu durchsuchende String ab Beginn dem Muster entsprechen muss. Dieses Zeichen wird auch Zeichenanker genannt.
Das Ende kennzeichnet man mit dem Dollar-Zeichen $.

Beispiele:
^Zeichen erlaubt alle Strings, die mit Zeichen beginnen, also z. B. „Zeichenkodierung“, nicht aber „DruckZeichen“.
Soll ein gültiger String mit Zeichen enden, so wäre das Pattern Zeichen$.
Nur das Wort „Zeichen“ als einzig gültige Zeichenfolge wird mit ^Zeichen$ beschrieben.
Auch ^$ ist ein gültiges Pattern: Es beschreibt eine leere Zeichenfolge.

4.3 Zeichenauswahlen / Zeichenbereiche
Innerhalb der eckigen Klammern können sich Zeichenauswahlen (verschiedene Zeichen) und/oder Zeichenbereiche befinden:
So erlaubt der die Zeichenauswahl [ASDF] einen der Großbuchstaben A S D F.

[0-9] steht für die Ziffern von 0 bis 9 (wobei 0 und 9 eingeschlossen sind). Der Bindestrich charakterisiert, dass es sich um einen Bereich handelt. (Wenn der Bindestrich aber direkt nach dem Zeichen [ oder als letztes Zeichen vor ] (also vor oder nach dem Bereich oder der Zeichenfolge) stehen würde, dann wäre der Bindestrich als Zeichen und nicht als „von-bis“ zu verstehen.)
[a-z] würde die Zeichen von a bis z beinhalten, [c-f] die zwischen c und f mit c und f inklusive.

In den Klammern können man auch mehrere Bereiche angeben werden:
So beschreibt das Pattern [A-Za-z0-9] sowohl Groß- als auch Kleinbuchstaben sowie Ziffern. Zu beachten ist, dass ä, ö, ü, ß nicht in [a-z] liegen.

Zeichenauswahlen und Bereiche können auch kombiniert werden.
[A-Za-zäöüßÄÖÜ] würde demnach alle Zeichen von A bis Z sowie Ä, Ö, Ü (auch als Kleinbuchstaben) akzeptieren. Oder [1-35-9] (Kombination [1-3] und [5-9]) erlaubt 1, 2, 3, 5, 6, 7, 8 und 9.

Diese Patternteile innerhalb der eckigen Klammern [] gelten jedoch nur für ein einzelnes Zeichen – sofern nicht durch Quantoren (siehe 4.5 Quantoren) hinter den Klammern anders angegeben.
Das Pattern ^[A-Za-zäöüßÄÖÜ]$ würde demnach zwar den einzelnen Buchstaben A oder s oder ü zulassen, nicht aber „As“ oder „sDk“ oder „sdfkl“.

4.4 Negationen
Wenn das Zeichen ^ nicht zu Beginn des Patterns verwendet wird, so steht es für eine Negation und bedeutet ungleich.
^[^A-Z]*$ würde alle Zeichen außer Großbuchstaben zulassen (alles außer die Zeichen A-Z).

4.5 Quantoren
Um dann zwei Großbuchstaben zu erlauben könnte man ^[A-Z][A-Z]$ verwenden. Was aber, wenn wir hundert Ziffern erlauben möchten? Hundert mal [0-9] schreiben?
Dann bzw. auch schon bei zweimaliger Wiederholung verwendet man Quantoren. Quantoren geben die Anzahl der Wiederholungen an.

Es gibt folgende Quantoren:
?: Der voranstehende Ausdruck ist optional, er kann einmal vorkommen, muss es aber nicht, d. h. der Ausdruck kommt null- oder einmal vor. (Dies entspricht {0,1})
+: Der voranstehende Ausdruck muss mindestens einmal vorkommen, darf aber auch mehrfach vorkommen. (Dies entspricht {1,})
*: Der voranstehende Ausdruck darf beliebig oft (auch keinmal) vorkommen. (Dies entspricht {0,})
{n}: Der voranstehende Ausdruck muss exakt n-mal vorkommen.
{min,}: Der voranstehende Ausdruck muss mindestens min-mal vorkommen.
{,max}: Der voranstehende Ausdruck darf maximal max-mal vorkommen (wird von .NET nicht unterstützt).
{min,max}: Der voranstehende Ausdruck muss mindestens min-mal und darf maximal max-mal vorkommen.
(Wikipedia)

Genau 100 Ziffern hintereinander als Muster zu definieren, könnte man so bewerkstelligen: ^[0-9]{100}$
Der Quantor steht hinter dem Bereich, für welchen er gelten soll.

4.6 Vordefinierte Zeichenklassen
Um nicht jedes Mal [0-9], [a-zA-Z], usw. schreiben zu müssen, kann man statt diesen Bereichen die Kurzschreibweise für vordefinierte Zeichenklassen angeben.

Wichtige Zeichenklassen sind:
\d: eine Ziffer [0-9]
\D: ein Zeichen, das keine Ziffer ist, also [\d]
\w: ein Buchstabe, eine Ziffer oder der Unterstrich, also [a-zA-Z_0-9] (und evtl. weitere Buchstaben, z. B. Umlaute)
\W: ein Zeichen, das weder Buchstabe noch Zahl noch Unterstrich ist, also [
\w]
\s: Whitespace; meistens die Klasse der Steuerzeichen \f, \n, \r, \t und \v
\S: ein Zeichen, das kein Whitespace ist [^\s]
(Wikipedia)

In neueren Implementationen von Regex sind zusätzlich nachfolgende POSIX-Klassen möglich.
Bemerkung: Die Regex-Engine von .NET unterstützt keine POSIX-Klassen!
[:alnum:]: Alphanumerische Zeichen: [:alpha:] und [:digit:].
[:alpha:]: Buchstaben: [:lower:] und [:upper:].
[:blank:]: Leerzeichen und Tabulator.
[:cntrl:]: Steuerzeichen. Im ASCII sind das die Zeichen 00 bis 1F, und 7F (DEL).
[:digit:]: Ziffern: 0, 1, 2,... bis 9.
[:graph:]: Graphische Zeichen: [:alnum:] und [:punct:].
[:lower:]: Kleinbuchstaben: nicht notwendigerweise nur von a bis z.
[:print:]: Druckbare Zeichen: [:alnum:], [:punct:] und Leerzeichen.
[:punct:]: Zeichen wie: ! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~ .
[:space:]: Whitespace: Horizontaler und vertikaler Tabulator, Zeilen- und Seitenvorschub, Wagenrücklauf und Leerzeichen.
[:upper:]: Großbuchstaben: nicht notwendigerweise nur von A bis Z.
[:xdigit:]: Hexadezimale Ziffern: 0 bis 9, A bis F, a bis f.
(Wikipedia)

4.7 Escape-Zeichen
Der Punkt ist ein Sonderfall. Normalerweise steht der Punkt für ein beliebiges Zeichen. Er kann auch für eine neue Zeile stehen. Ist der Punkt als solcher gemeint, so muss man diesen „escaped“ verwenden, also indem man vor dem Punkt (dem zu escapenden Zeichen) einen Backslash einfügt: .
Unter „Escapen“ versteht man, dass die Meta-Bedeutung eines Zeichens aufgehoben wird und dass das Zeichen als solches dargestellt wird.
Um folgende Zeichen zu verwenden, muss man diese auch escapen: \ ( ) [ { | * ? + ^ $ . # [Leerzeichen] (Einige Zeichen müssen nur in einem bestimmten Kontext escaped werden.)
Aufzupassen gilt auch bei der Verwendung folgender beiden Zeichen: „ \ (siehe 2. Verwendung von Regex in C# auf Seite 3)

Zum Escapen bietet Regex die statische Methode Escape. Diese Methode, der man einen String als Parameter übergibt, versieht einen minimalen Satz von Metazeichen mit Escape-Zeichen und gibt das Ergebnis als String zurück. Das Gegenteil erledigt die statische Methode Unescape.

4.8 Weitere Zeichen
^: Zeilenanfang (nicht zu verwechseln mit der Negation ^ bei der Zeichenauswahl mittels [ und ]).
$: je nach Kontext für Zeilen- oder Stringende, wobei noch ein \n folgen darf. Das tatsächliche Ende wird von \z gematcht.
: hebt gegebenenfalls die Metabedeutung des nächsten Zeichens auf. Beispielsweise lässt der Ausdruck „(A*)+“ die Zeichenketten „A*“, „AA“ usw. zu. Auf diese Weise lässt sich auch ein Punkt „.“ mit . suchen.
\b: steht für die leere Zeichenkette am Wortanfang oder am Wortende.
\B: steht für die leere Zeichenkette, die nicht den Anfang oder das Ende eines Wortes bildet.
&lt;: steht für die leere Zeichenkette am Wortanfang.
&gt;: steht für die leere Zeichenkette am Wortende.
(Wikipedia)

4.9 Gruppierungen
Gruppierungen sind Zusammenfassungen von Ausdrücken in runden Klammern. Diese ermöglichen Wiederverwendbarkeit dieser Teilausdrücke und das Einbauen von Alternativen („ODER“; siehe 4.10 Alternativen auf Seite 8).

^001$ erlaubt nur „001“, ^(001)*$ würde „001001001“ erlauben, da der Quantor * auf die Gruppierung angewandt wird und somit die drei Zeichen in der Klammer beliebig oft wiederholt werden dürfen.

Gruppierungen können mit [Gruppierungsindex] aufgerufen werden. (Anmerkung: Dieser Index ist nicht nullbasiert.)
Beispiel: ^(136[0-3])[A-Z]\1$ akzeptiert: „1360A1360“, „1361A1361“, ..., „1361A1363“, …, „1360B1360“, …, „1363Z1363“;
\1 verweist (referenziert) auf den Inhalt der ersten Klammer. Daher muss an der Stelle von \1 das stehen, was von der 1. Gruppierung gematcht wurde.
Dies ist nützlich, wenn man überprüfen möchte, ob beispielsweise zwei gleiche Wörter (hintereinander) vorkommen.

Anstatt die Gruppierungen anhand des Index aufzurufen, kann ihnen ein Namen zugewiesen werden. Der Gruppenname darf keine Satzzeichen enthalten und nicht mit einer Zahl beginnen.
Den Gruppennamen definiert man, indem man nach Öffnen der runden Klammer ?<[Gruppenname]> schreibt. Der Aufruf erfolgt mit \k<[Gruppenname]>. [Gruppenname] ersetzt man mit dem gewünschten Namen.

Beispiel:
Erste Verwendung der Gruppe und Namensdefiniton: ^(?<DeutscheSonderzeichen>[äöüÄÖÜß])$
Aufruf: \k<DeutscheSonderzeichen>

Das Zurückgreifen auf Gruppierungen nennt man „Backtracking“.

Welches Zeichen eine Gruppe gematch hat, kann aus der Property Match.Groups gelesen werden, falls man die Methode Match verwendet hat.

4.10 Alternativen
Alternativen werden mit dem „Oder“-Zeichen in Regex aufgezählt. Das Oder wird mit dem Zeichen | (Alt Gr + <) dargestellt.
Beispiel: (001|005|1008) erlaubt „001“ oder „005“ oder „1008“.

Selbstverständlich können Alternativen auch verschachtelt werden.
Bsp: (Airbus (A350|A380)|Boeing (747|787))

4.11 Kommentare
Kommentare gibt man folgendermaßen an: (?#[Kommentar])
Beispiel: ^[0-9]{2}(?#2 Ziffern erforderlich)$
Kommentare können vor allem bei längeren und verschachtelten Ausdrücken sinnvoll sein, da man sich später beim Überarbeiten des Patterns leichter tut.

4.12 Gieriges Verhalten
Von gierigem (engl. greedy) Verhalten spricht man, wenn von einem regulären Ausdruck die längste passende Zeichenkette ausgewählt wird. Dies ist nicht immer erwünscht und kann deshalb auch deaktiviert werden.

Beispiel:
Zu überprüfender String: „12312431231235“

Gieriges Verhalten:
o Pattern: ^1.1
o Ergebnis von Match(@“^1.1“).Value: „12312431231"
o Erst mit dem letzten Vorkommen (im Suchstring) des Zeichens hinter .
im Pattern verwendet die Regex-Engine dieses als nachfolgendes Zeichen; vorherige Zeichen, die auf das Zeichen nach .
zutreffen, werden als beliebiges Zeichen (Punkt) interpretiert. Der Punkt hat alle außer dem letzten auf das Ende zutreffenden Zeichen „gefressen“.

Genügsames Verhalten:
o Nicht gieriges Ergebnis wäre: „1231“
o Hier spricht man von genügsamen Verhalten, da die letzte Ziffer von „1231“, die eins, auf die 1 nach dem * zutrifft.

Es gibt 2 Möglichkeiten „genügsames“ Verhalten zu verwenden:
Eine Möglichkeit ist, hinter dem Quantor das Zeichen ? anzuhängen. Also wird das obere Beispiel zu: ^1.*?1. Aus Performance-Gründen ist dies aber nicht empfehlenswert, da der Regex-Interpreter jedes Mal zurückspringen und die „Backreference“ überprüfen muss.
Die zweite Möglichkeit wäre eine Umformung des oberen Beispiels zu folgendem Pattern: ^1[^1]*1 (1. Zeichen eine 1, beliebig viele „Nicht-Eins“-Zeichen im Mittelteil und die 1 als Ende)

4.13 Positive und negative Lookarounds
Anmerkung zu Kapitel 4.13 und 4.14: Dieses und das folgende Kapitel sind fortgeschrittene Konzepte, gehen tiefer in die Materie Regex ein und sind dementsprechend etwas komplizierter. Diese beiden Kapitel sind eher an Fortgeschrittene gerichtet. Sie sollten diese Kapitel nur lesen, wenn Sie die vorherigen verstanden haben. (Um zu überprüfen, ob Sie Regex verstanden haben, können Sie auf Seite 12 bei 6. Übungen üben. Das Wissen über diese beiden Kapitel ist zum Lösen der Fragestellungen nicht notwendig.)

Die Lookarounds stellen die Leistungsfähigkeit von Regex nochmals unter Beweis. Man unterscheidet zwischen Lookbehinds und Lookaheads, wobei diese wiederum in positive und negative Lookarounds unterteilbar sind.

Mit Lookarounds lässt sich festlegen, dass eine Zeichenfolge nur gematcht wird, wenn sich direkt vorher und/oder nachher eine bestimmte Zeichenfolge befindet. Da diese Bedingungszeichenfolge nicht in das Suchergebnis (Regex.Value) aufgenommen wird, spricht man auch von „zero-width-assertions“.
Die [Bedingung] (auch „Behauptung“ genannt) wird als regulärer Ausdruck angegeben, wobei die Verwendung von Quantoren (*, +, {0,5}, …) jedoch nicht möglich ist.

4.13.1 Lookbehinds
Lookbehinds beziehen sich auf Bereiche, die vor der momentan untersuchten Stelle im zu durchsuchenden Text liegen und somit bereits hinter uns liegen (deshalb „Lookbehind“).
Vor dem eigentlichen Suchmuster wird nach einem weiteren Suchmuster gesucht. Nur wenn das weitere Suchmuster erfolgreich gefunden wird (positiv) bzw. erfolgreich nicht gefunden wird (negativ), gibt es einen Treffer.

Positive Lookbehinds behaupten, dass (direkt) vor einem Ausdruck etwas stehen soll. Die Bedingung wird vor dem Ausdruck mit (?≤[Bedingung]) angegeben.

Negative Lookbehind-Behauptungen, die festlegen, dass (direkt) vor einem Ausdruck etwas nicht stehen soll, werden mit (?<![Bedingung]) beschrieben, das vor den Ausdruck gestellt wird.

4.13.2 Lookaheads
Lookaheads sind das Gegenteil von Lookbehinds und beziehen sich auf Bereiche, die nach der aktuell untersuchten Stelle liegen (deshalb „Lookahead“).

Positive Lookaheads behaupten, dass nach einem Ausdruck etwas Bestimmtes stehen soll. Die Angabe erfolgt mit dem Ausdruck (?=[Bedingung]).

Negative Lookahead-Behauptungen lauten (?![Bedingung]). Direkt nach der untersuchten Stelle soll eine Zeichenfolge nicht vorkommen.

4.13.3 Zusammenfassung Lookarounds

Syntax       Positiv            Negativ	   
Lookbehind   (?<=[Bedingung])   (?<![Bedingung])	   
Lookahead    (?=[Bedingung])    (?![Bedingung])

Positive Lookbehind-Bedingung: (?≤de)
Triff nur („Matche“ nur), wenn vorher „de“ steht.
Negative Lookbehind-Bedingung: (?<!de)
Triff nur, wenn vorher nicht „de“ steht.
Positive Lookahead-Bedingung: (?=de)
Triff nur, wenn nachher “de” steht.
Negative Lookahead-Bedingung (?!de)
Triff nur, wenn nachher nicht “de” steht.

4.13.4 Beispiele zu Lookarounds

(?≤0)[0-9]{3}(?!€)
o (?<0): Lookbehind, positiv (vor [0-9]{3} soll eine „0“ stehen)
o [0-9]{3}: Ausdruck im Mittelteil (kein Lookaround!) (\d{3} würde das gleiche beschreiben)
o (?!€): Lookahead, negativ (nachher soll nicht „€“ stehen)
(?<![a-eA-M]).server1(?=.us)
o (?<![a-eA-M]): Lookbehind, negative (vor .server1 soll weder ein Kleinbuchstabe von a-e noch ein Großbuchstabe von A-M stehen)
o .server1: Mittelteil (. steht für einen escapten Punkt)
o (?=.us): Lookahead, positive (nach .server1 soll “.us” stehen)

4.14 RegexMatchEvaluator
RegexMatchEvaluator stellt eine Erweiterung der Regex-Methode Replace dar.

Um den RegexMatchEvaluator zu verwenden, benötigt man eine Instanz von MatchEvaluator. Diese Klasse befindet sich im gleichen Namespace wie Regex und wird folgendermaßen instanziert:
MatchEvaluator myEvaluator = new MatchEvaluator([Methode]);

Außerdem braucht man eine Methode mit einem String als Rückgabewert:

public string ReplaceMatch(Match m)
{
	[IF-Anweisungen]
	return [Ersetzung];
}

(Sollten Sie dieses Beispiel in einer Konsolenanwendung ausprobieren, so fügen Sie im Methodenkopf vor „string“ das Schlüsselwort static ein.)

Den Parameter [Methode] bei der Instanzierung ersetzt man in diesem Beispiel mit ReplaceMatch, da dies der Name der Methode mit String-Rückgabe ist.

Das Pattern, das wir bisher dem Regex-Konstruktor bekannt gegeben haben, wird erst jetzt der Replace-Methode übergeben. Das Ersetzen mit der statischen Replace-Methode sieht allgemein so aus:

string [Variablenname] = Regex.Replace([Zu ersetzender String], [Pattern], [MatchEvaluator-Instanz]);

Beispiel:
In diesem einfachen Beispiel werden alle Beistriche durch eine leere Zeichenkette ("") ersetzt. Da der Ersatzstring unabhängig vom Treffer gleich bleibt, ist in diesem Fall die Verwendung von MatchEvaluator nicht besonders sinnvoll, denn die gleiche Aufgabe ließe sich auch einfacher mit der Replace-Methode durchführen.

MatchEvaluator myEvaluator = new MatchEvaluator(ReplaceMatch);
string output = Regex.Replace("H,a,l,l,o", ",", myEvaluator);

Und die Methode:

public string ReplaceMatch(Match m)
{
	return "";
}

Die Variable output würde „Hallo“ enthalten, da von der Methode ReplaceMatch jeder gefundene Beistrich mit einer leeren Zeichenkette ersetzt wird.
Lösung mit der Replace-Methode von Regex:

Regex.Replace("H,a,l,l,o", ",", "");

(Allgemein:

Regex.Replace([ZuErsetzen], [Pattern], [Ersatz]);

)

Sinnvoll wird der MatchEvaluator, wenn wir Suchtreffer mit einem flexiblen String ersetzen möchten.

Beispiel:

  • Ziel: Wir wollen alle „ae“ zum Umlaut „ä“, alle „oe“ zu … umwandeln
  • Wir erstellen eine Instanz von MatchEvaluator mit dem Namen myEvaluator und übergeben dem Konstruktor den Namen der folgenden Methode:
  • Methode:
public string ReplaceMethode(Match m)
{
 	switch (m.Value)
 	{
 		case "ae":
 		return "ä";
		case "oe":
 		return "ö";
		case "ue":
 		return "ü";
 		case "Ae":
 		return "Ä";
		case "Oe":
 		return "Ö";
		case "Ue":
 		return "Ü";
 		default:
 		return "";
 	}
}

(Den default-Zweig im Switch-Case-Konstrukt brauchen wir, damit alle Codepfade einen Wert zurückgeben, wie es der Compiler haben will.)

  • Durchführen der Ersetzung mit der Replace-Methode (Pattern: [aou]e):
    string ersetzterString = myRegex.Replace("Franz faehrt von Muenchen nach Oesterreich, um einen Baer zu suchen.", "[aou]e", myEvaluator, RegexOptions.IgnoreCase);
  • String nach der Ersetzung: Franz fährt von München nach Österreich, um einen Bär zu suchen.
  • Erklärung: Alle ae, oe und ue im String werden je nach Treffer mit ä, ö oder ü ersetzt. Aufgrund von RegexOptions.CaseInsensitive trifft Regex auch Ae, Oe und Ue. (Bei jedem Treffer (Match) wird die Methode ReplaceMethode aufgerufen und der Treffer mit dem Rückgabewert der Methode ersetzt.)

(Weitere sinnvolle Ersetzungen wären, dass die Klasse, in der sich die Methode befindet, eine statische Int-Variable mit dem Ausgangswert 0 enthält. Diese Variable wird bei jedem Aufruf der Methode inkrementiert (um den Wert 1 erhöht) und als Ersetzungsstring zurückgegeben. Siehe: http://msdn2.microsoft.com/de-de/library/system.text.regularexpressions.matchevaluator(VS.80).aspx)

5. Tipps zur Performance
Einige Tipps, um die Performance zu verbessern:Alternativen sind ziemlich rechenintensiv und sollten deshalb so selten wie möglich verwendet werden. Wenn sie nicht vermeidbar sind, so sollte die häufigste Möglichkeit als erste gelistet werden. Man sollte soviel Text wie möglich explizit und ohne Alternativen angeben, da dies eine effektive innere Optimierung ermöglicht. (Beispiel: xxxxx* statt x{5,} oder S(ams|onn)tag statt (Samstag|Sonntag)) Klammern sollten nur dort benutzt werden, wo sie wirklich nötig sind. Vordefinierte Zeichenklassen sollten benutzt werden. Falls vom Sinn her möglich sollte man auf jeden Fall den Pattern mit ^ beginnen. (http://www.jex-treme.de/forum/thread.php?threadid=18064)

6. Übungen zu Regex
Und nun einige Übungen: Bei jeder der 17 Übungen sollen Sie ein Pattern schreiben, das auf die Fragestellung zutrifft. Zur Verdeutlichung der Fragestellung hat jede Frage ein Beispiel. Die Lösungen stehen direkt unter der Frage und sind meist erklärt. Die Übungen sind nach Schwierigkeitsgrad gestaffelt.

++Fragestellung: ++Pattern, das eine 4-stellige Zahl erlaubt, wobei das erste Zeichen (der Zahl) ungleich "0" sein muss (Bsp: 7344)
Lösung: ^[1-9][0-9]{3}$
Beschreibung der Lösung:
^ und $, damit sich das Muster auf den gesamten String bezieht
[1-9]: damit ein Zeichen aus 1, 2, 3, ..., 9 gewählt wird
[0-9]: damit ein Zeichen von 0 bis 9 (inklusive) gewählt wird (Alternativen: [:digit:], \d)
{3}: damit [0-9] 3-mal wiederholt wird ([0-9]{3} entspricht [0-9][0-9][0-9])

Wort mit 4 Zeichen (Bsp: Haus)
^[a-zA-Z][a-z]{3}$
[a-zA-Z]: als erstes Zeichen einen Groß- oder Kleinbuchstaben (gleichbedeutend wäre: [a-zA-Z]{1})
[a-z]{3}: 3-mal Kleinbuchstaben sind vorgeschrieben

Nur Buchstaben "a" und "b" enthalten (Bsp: abaababbaaa)
^[ab]$
[ab]
: Beliebig oft (oder auch nie) darf a oder b vorkommen
Binärzahlen (längenmäßig unbeschränkt) (Bsp: 00100101)
^[01]*$

Wort mit Großbuchstaben zu Beginn, das mit "en" endet (Bsp: Tannen)
^[A-Z][a-z]en$
[A-Z]: für den Großbuchstaben am Wortanfang
[a-z]
: beliebig viele Kleinbuchstaben
en: mit en muss der String enden.

Ziffer Strich Ziffer Strich Ziffer (Bsp: 1-7-6)
^[0-9]-[0-9]-[0-9]$

  • (2. Vorkommen): Bindestrich wird als solcher verwendet, da er nicht innerhalb der eckigen Klammern ist
    (Weitere Möglichkeit: ^([0-9]-){2}[0-9]$)

"Wort", das nur aus Kleinbuchstaben besteht und keinen Selbstlaut enthält (Bsp: dkfs)
^[b-df-hj-np-tv-z]*$

Zahl (1. Stelle ungleich "0") mit Einheit (" Stück") (Bsp: 60 Stück)
^[1-9][0-9]* Stück$
[1-9]: eine Ziffer von 1 bis 9, damit die 1. Stelle nicht 0 sein kann
[0-9]*: beliebig viele (auch kein Vorkommen möglich) Ziffern
Stück: muss am Ende stehen

Smiley: 1. Zeichen ":" oder ";"; 2. Zeichen "-"; 3. Zeichen "(" oder ")" oder "|"; (Bsp: 😉
^[:;]-[()|]$
[:;]: Doppelpunkt oder Strichpunkt als 1. Zeichen
-: Bindestrich als 2. Zeichen
[()|]: ( oder ) oder | als 3. Zeichen

Zahl zwischen -750 und 750 (wenn Zahl positiv, dann kein Vorzeichen; die Zahl kann auch zwei- oder einstellig sein; ohne führende Nullen) (Bsp: 411)
^-?(750|7[0-4][0-9]|[1-6][0-9]{2}|[1-9]?[0-9])$
-?: Zeichen „-„ kann vorkommen
750: 750
|7[0-4][0-9]: oder 700 bis 749 möglich
|[1-6][0-9]{2}: oder 100 bis 699 (beginnt mit 1 bis 6, danach zwei beliebige Ziffern)
|[1-9]?[0-9]: oder 0-99 (beginnt optional mit 1 bis 9, danach eine beliebige Ziffer)

Dreistellige Zahl von -750 bis 750 (wenn Zahl positiv, dann kein Vorzeichen; ohne führende Nullen) (Bsp: 747)
^-?(750|7[0-4][0-9]|[1-6][0-9]{2})$

4-stellig mit Buchstaben "A" an 1. Stelle gefolgt von Zahl [300;399], oder Buchstabe "B" zu Beginn gefolgt von Zahl [737;747;...;787] (Zahl: 1. Stelle "7", 2. Stelle 3, 4, 5, 6, 7 oder 8, 3. Stelle 7) (Bsp: A380)
^(A3[0-9]{2}|B7[3-8]7)$
A3[0-9]{2}: „A3“ + zwei mal Ziffer von 0 - 9
|B7[3-8]7: oder „B7“ + Ziffer von 3 – 8 + „7“

Wort mit mind. 2 gleichen aufeinander folgenden Zeichen bzw. Buchstaben (Bsp: Schiff)
([a-zA-Z])\1
[a-zA-Z]: Buchstabe
\1: Zeichen, welches in der 1. Gruppierung gematcht wurde

Uhrzeit im Format 00:00:00 (Bsp: 16:41:33)
^(2[0-3]|[0-1]?[0-9])(:[0-5][0-9]){2}$
(2[0-3]|[0-1]?[0-9]):
2[0-3]: „2“ gefolgt von einer der Ziffern 1, 2, oder 3 (für 20, 21, 22, 23 Uhr)
|[0-1]?[0-9]: oder Ziffer 0 oder 1 gefolgt von einer Ziffer (für 00 Uhr bis 19 Uhr)
(:[0-5][0-9]){2}:
:: Doppelpunkt
[0-5][0-9]: Minuten/Sekunden 00 bis 59
{2}: wird genau 2-mal wiederholt (einmal für die Minuten, einmal für die Sekunden)

E-Mail-Adresse (ohne Umlaute und ß) (Bsp: bill_gates@googlemail.com)
^[a-zA-Z0-9_-]{1,}[a-zA-Z0-9_-.][a-zA-Z0-9_-]{1,}@[a-zA-Z0-9_-]{2,}.[a-z]{2,4}$
[a-zA-Z0-9_-]{1,}[a-zA-Z0-9_-.]
[a-zA-Z0-9_-]{1,}: Groß-, Kleinbuchstaben, Ziffern, Bodenstrich, Bindestrich als Beginn und als letztes Zeichen vor dem @ erlaubt; zusätzlich zu diesen Zeichen ein Punkt in der Mitte erlaubt (Punkt darf also nicht am Beginn und als letztes Zeichen vor dem @ stehen)
@: @-Zeichen
.: Punkt als solcher und deshalb escaped
[a-z]{2,4}: für die 2 bis 4 Zeichen lange Toplevel-Domain (Bsp: de, com, info)
(und noch viele andere Lösungen (Microsoft-Lösung (in Microsoft Visual Studio Web Developer 2005 Express Edition): \w+([-+.']\w+)@\w+([-.]\w+).\w+([-.]\w+)*))

Internet-Adresse (ohne Umlaute und ß) (Bsp: http://www.google.de/)
^(https?://)?(www2?.)?[a-zA-Z0-9&-()$/]{2,}.[a-z]{2,4}/?$
(https?://)?: Fragezeichen nach https (Zeichen kann vorkommen) bezieht sich nur auf das vorhergehende Zeichen, das in diesem Fall das s ist; das Fragezeichen am Ende, welches hinter einer Gruppierung steht, bezieht sich auf die Gruppierung; erlaubt ist also: http:// oder https:// oder gar nichts
(www2?.)?: vorkommen kann: www. oder www2. oder gar nichts
[a-zA-Z0-9&-()$/]{2,}: erlaubte Zeichen für die Second-Level-Domain, wobei diese mindestens 2 Zeichen ({2,}) lang sein muss; ( und ) stehen für die offene und geschlossene runde Klammer als solche, da diese Klammern ansonsten als Gruppierung interpretiert werden
[a-z]{2,4}: Top-Level-Domain mit 2 – 4 Zeichen
/?: / als letztes Zeichen erlaubt
(und noch viele andere Lösungen (Microsoft-Lösung: http(s)?://([\w-]+.)+[\w-]+(/[\w- ./?%&=])?))
Betrag in € (optional 2 Kommastellen), mit 1.000er-Trennzeichen (Bsp: 10.000,00 €)
^[0-9]{1,3}(.[0-9]{3})
(,[0-9]{2})?[ ]?€$
[0-9]{1,3}: eine bis maximal 3 Ziffern zu Beginn (wenn Zahl größer 999, dann stellen diese Ziffern die Ziffern vor dem 1. 1000er-Trennzeichen dar)
(.[0-9]{3})*:
.: steht für den Punkt; muss mit dem Backslash escaped werden (Punkt für Tausender-Trennzeichen benötigt)
[0-9]{3}: 3 Ziffern
*: diese Gruppierung kann 0 – unendlich mal vorkommen
(,[0-9]{2})?:
,: Komma
[0-9]{2}: 2 Ziffern für die 2 Kommastellen
?: diese Gruppierung kann 0 oder 1-mal vorkommen
[ ]?: Leerzeichen kann vorkommen
€: €-Zeichen als Ende

7. Weblinks
Seite zum Tutorial auf mycsharp.de: Feedback, Online-Version,
Veröffentlichung von neueren Versionen:
[Artikel] Regex-Tutorial
Wikipedia-Artikel zu Regex (deutsch):
Regex
Sehr gutes deutsches und einfach verständliches Tutorial:
http://www.danielfett.de/df_artikel_regex.html
Deutsches Tutorial:
http://regexp-evaluator.de/tutorial/
Deutsches Tutorial:
http://www.lrz-muenchen.de/services/schulung/unterlagen/regul/
Deutsches Tutorial in Tabellenform für Fortgeschrittene:
http://mojo-corp.de/regulaere_ausdruecke_c_sharp.html
Behandlung von Regex-Fehlermeldungen (deutsch):
http://regexp-evaluator.de/tutorial/fehlermeldungen/
Video-Clip im Microsoft Developer Netzwerk (MSDN) (deutsch):
http://www.microsoft.com/germany/msdn/webcasts/library.aspx?id=118760869
Englischsprachiger Artikel aus Wikipedia zu Regex:
Regular expression
Sehr gutes englisches Tutorial für Einsteiger auf Codeproject:
http://www.codeproject.com/dotnet/RegexTutorial.asp
Weiteres englisches Tutorial auf Codeproject:
http://www.codeproject.com/string/re.asp
Ausführliches englisches Tutorial zu Regex:
http://www.regular-expressions.info/tutorial.html
Informationen bei MSDN:[URL] [URL]http://msdn.microsoft.com/de-de/library/hs600312.aspx[/URL][/url]
Englische Webseite mit einer Sammlung von regulären Ausdrücken:
http://regexlib.com/default.aspx

10. Literatur
Um das letzte Quäntchen aus Regex herauszukitzeln, kann folgendes Buch empfohlen werden:
o „Reguläre Ausdrücke“ von Jeffrey E. F. Friedl, O'Reilly Verlag

© 2007-2009; webstarg.

28.07.2007 - 20:42 Uhr

:::

Hallo Community,

mein Regex-Tutorial ist fertig.

Das Tutorial ist sowohl im PDF-Format (empfohlen) als auch im BBCode-Format (im nächsten Post) verfügbar.

Ich hoffe, das Tutorial ist einigermaßen einsteigerfreundlich und verständlich.

Ich freue mich über jede Art von Feedback. 🙂

Viel Spaß beim Lesen des Tutorial!
webstarg

28.07.2007 - 20:36 Uhr

Hallo,

geht das mit Visual Studio C# 2005 Express?

mfg
webstarg

27.07.2007 - 16:57 Uhr

Hallo quertz,

ich weiß nicht, ob das so einfach möglich ist.

Meiner Meinung nach ist der einzige Weg, eine Klasse zu erstellen, die von String erbt und dort die Methode hinzuzufügen.

Dann kannst du aber beim Erstellen der Instanz nicht
string a = "d";
schreiben sondern
MeineStringKlasse mSK = new MeineStringKlasse("d");

Methodenaufruf:
string theString = mSK.MeineMethode("fdklö");

Ich glaube nicht, dass das was du möchtest, so sinnvoll erledigt werden kann.

mfg
webstarg

27.07.2007 - 16:39 Uhr

Original von el_vital
Oder soll ich beim ersten Speichern die Sachen erzeugen und dann nur Größe, Position und Image ändern?

Würde ich machen.

Evtl. kannst du eine Geschwindigkeitsmessung durchführen und daraufhin entscheiden.

webstarg

27.07.2007 - 16:30 Uhr

Hallo el_vital,

wieso erstellst du die PictureBoxen jedes mal neu und weist ihnen nicht einfach das neue Bild zu. Wenn sie nicht gewünscht sind, blendest du sie mit Visible = false aus.

Ansonsten solltest du myPictureBox.Dispose() aufrufen, nachdem du diese nicht mehr brauchst.

grüße
webstarg

26.07.2007 - 17:18 Uhr

Hallo Community,

ich habe eine Frage zu SharpDevelop.

In der aktuellen Version (2.2) wurden die Projektvorlagen nochmals mit mehr Beispieltext gefüllt. Wenn ich zum Beispiel ein neues Consolen-Projekt erstellen, dann habe ich dort schon eine Beispielanwendung mit Kommentaren, Console.WriteLine und Console.ReadLine. Das mag für Anfänger interessant sein, wenn man öfters neue Projekte erstellt stört das aber.
Auch bei Windows-Anwendungen stören mich die Kommentare ("//Add your code here after the InitializeComponent", ...); mittlerweile kann ich die eh alle auswendig.

Gibt es einen einfachen Weg diese Projektvorlagen anzupassen?
(Mit einfach meine ich, nicht selbst in der Source herumpfuschen und kompilieren.)

mfg
webstarg

26.07.2007 - 00:16 Uhr

Ich biete mehr.
Ich biete ca. 508.000.
Wobei es von Zahl zu Zahl abhängt ob es geht. Ungerade Zahlen stürzen bereits ab ca. 60.000 ab (try-catch greift nicht ein, Console schließt sich).
Ab 508.000 gehen nur noch bestimmte. Etwas ließe sich aber noch herausholen. 😉


using System;

	class Program
	{
		public static void Main()
		{
			do
			{
			Console.WriteLine("Please enter beginning and ending split by a comma:");
			string[] input = Console.ReadLine().Split(',');
			
			int lastOk = 0;
			
			try
			{
				int begin = Convert.ToInt32(input[0].Trim());
				int end = Convert.ToInt32(input[1].Trim());
				
				for (int i = begin; i < end; i++)
				{
					System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(i, i);
					lastOk = i;
					
					if (i % 100 == 0)
					{
						Console.WriteLine(i + ">");
					}
				}
				Console.WriteLine("Ended without error from " + begin + " to " + end);
			}
			catch (Exception e)
			{
				Console.WriteLine("Last good one is: " + lastOk);
				Console.WriteLine();
				Console.WriteLine(e.Message);
			}
			}
			while (Again());
		}
		
		static bool Again()
		{
			Console.WriteLine("Enter 'y' to run this test again.");
			
			return (Console.ReadLine().ToLower() == "y");
		}
}


  • Referenz zu System.Drawing hinzufügen

mfg
webstarg

25.07.2007 - 23:46 Uhr

Original von herbivore
um aus der gematchten Zahl das Zeichen mit dem entsprechenden Zeichencode zu machen.

Ach so, habe geglaubt diese Zeichenfolge soll nur entfernt werden.

grüße
webstarg

25.07.2007 - 22:08 Uhr

@ herbivore:

Ok, hast du eingefügt. 😉

Was ich fragen wollte:

Wieso MatchEvaluator in diesem Falle?

mfg
webstarg

25.07.2007 - 21:35 Uhr

Out denke ich nicht; ich glaube das wird nur aus Platzgründen gemacht.

Dass im Browser/Office mehr Sachen dargestellt werden können.

webstarg

25.07.2007 - 20:47 Uhr

Original von herbivore
Ein einfacher Pattern für die Tags wäre @"<[^]*>".

Hallo herbivore,

folgendes: entweder du hast dich ein Zeichen vergessen oder ich muss mein (bald erscheinendes) Tutorial ergänzen. 😉

Mein Pattern-Vorschlag lautet: @"<[^>]*>"

Wobei Variante 1 wahrscheinlicher ist...

25.07.2007 - 20:37 Uhr

Hallo Lobo,

die Methode Replace der Klasse Regex im Namespace System.Text.RegularExpressions trifft auf dein Problem zu.

mfg
webstarg

25.07.2007 - 16:59 Uhr

wieder ein vermeintlicher Frameworkfehler lach

wie gestern: Ein Neuling mit 3 Beiträgen, der geglaubt hat, er habe einen noch unentdeckten Fehler gefunden.

mfg
webstarg

24.07.2007 - 22:12 Uhr

String.Concat wäre auch eine Möglichkeit.

grüße
webstarg

24.07.2007 - 17:33 Uhr

Hallo DiscMaster,

vielleicht interessiert dich das noch:
[Artikel] Benutzen von UserControls / abgeleiteten Controls im Designer von Visual Studio 2

mfg
webstarg

24.07.2007 - 17:18 Uhr

Original von ZiMD
Als Aufwandsentschädigung genehmige ich mir dann aber auch eine 1000€ MegaUltraPremiumversion ...

😁

@ progger:
SharpDevelop? 🤔

webstarg

24.07.2007 - 09:54 Uhr

Ja,

Dokumente und Einstellungen\Andreas\Lokale Einstellungen\Anwendungsdaten\<Firma>\ <Anwendung>

(laut Galileo Openbook)

mfg
webstarg

24.07.2007 - 00:02 Uhr

Hallo LukeGee,

was ich hier geschrieben habe, trifft auch auf dein Programm zu.

Ich habe im gepackten Zustand die exe-Datei geöffnet und diese kann somit logischerweise die Datenbank nicht finden, da sich diese nur im Archiv befindet (die exe aber in einem temporären Ordner ausgeführt wird). Und bumm, "unhandled exception".

Das könntest du beheben.

mfg
webstarg