Laden...

Regex und Trennung

Erstellt von Lost-Ha(n)f-PHP vor 16 Jahren Letzter Beitrag vor 16 Jahren 1.705 Views
Lost-Ha(n)f-PHP Themenstarter:in
58 Beiträge seit 2007
vor 16 Jahren
Regex und Trennung

Hallo Leute,

ich benötige mal wieder eure Hilfe!

Ich habe mir eine RichTextBox geschrieben, die Text highlightet. Dazu habe ich mir zur Hilfe ein paar Internetseiten angeguckt und Beispiel-Code kopiert. Jetzt funktioniert es schön bei allen Worten.

Jetzt soll dieses Teil allerdings nicht nur Worte highlighten, sondern Syntax, die ich in einem Hashtable habe.

Meine Regex arbeiten mit:


	// Findet den Wortanfang.
	private static readonly Regex wordStartRegex = new Regex(
		@"\b\w",
		RegexOptions.Compiled | RegexOptions.RightToLeft);

	// Findet das Wortende.
	private static readonly Regex wordEndRegex = new Regex(
		@"\w\b",
		RegexOptions.Compiled);

Wie schon erwähnt, findet dieser Code nur Worte.
Wenn ich nun einen Teil, wie "<?php" so darstellen möchte: **:::

Mit freundlichem Gruß

Lost-Ha[n]f-PHP

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Lost-Ha[n]f-PHP,

Ich habe mir eine RichTextBox geschrieben, die Text highlightet.

wohl nicht geschrieben, sondern von [Tutorial] Einfaches Keyword-Highlighting kopiert und angepasst. 🙂

Und wie ich dort schon schrieb:

dazu wäre nur eine kleinere Änderung an den verwendeten Regex-Pattern nötig. Die momentanen Pattern arbeiten ja absichtlich mit Wortgrenzen (\b), damit bei "forget" nicht fälschlich "for" innerhalb des Wortes hervorgehoben würde.

Also das \b ist es, worauf es ankommt.

herbivore

Lost-Ha(n)f-PHP Themenstarter:in
58 Beiträge seit 2007
vor 16 Jahren

Uhh!

Cool. Aber da hatte ich das nicht her!
Aber das hier ist noch eine Spur besser als das, was ich wohl in abgeänderter Form gefunden hatte.)

Also wenn ich das Ganze \w\b uns \b\w durch ein reines \b ersetze, dann schmeißt der mir einen Fehler. Bei der Auche nach dem Anfang findet


Match m = wordStartRegex.Match(text, index);

nichts und lässt es auf ein stehen.

Bei


m = wordEndRegex.Match(text, wordStart);

das Gleiche und so kommt es mein Substring zum Fehler, da ab Position 1, Länge 1 nach dem ersten Tastendruck (Zeichen "<") kein Zeichen ist.

Woran kann das liegen? Ich habe versucht mich ein bisschen in Regex einzulesen, aber so recht finde ich da nichts, was passen will...

Mit freundlichem Gruß

Lost-Ha[n]f-PHP

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Lost-Ha[n]f-PHP,

mit auf das \b kommt es an, meinte ich, dass es davon abhängt. Das \b darf also gerade nicht stehen bleiben. Aber dann bekommt man Problem mit Schlüsselworten, die nur aus Buchstaben bestehen. Das \b steht ja nicht ohne Absicht da. Deshalb musst du mal genau überlegen, wann er Pattern eigentlich passen soll.

[Artikel] Regex-Tutorial

herbivore

Lost-Ha(n)f-PHP Themenstarter:in
58 Beiträge seit 2007
vor 16 Jahren

Ok erst mal vielen Dank.

Ich habe mir der Tutorial angeeignet und ausprobiert...
Aber leider bin ich nicht zum Erfolg gekommen.

Als Beispiel habe ich mir gesagt, dass ein Wort immer bei einem Leerzeichen, am Anfang oder Zeile oder bei einem Semikolon erreicht sein soll und das Ende immer bei Leerzeichen, Ende der Zeile oder einem Semikolon.

Wie müsste ich das in die beiden Regex einsetzen? Ich habe da viel mit rumprobiert, aber leider nichts gefunden, was mir half...

Ich bitte um Hilfe.
Danke im Voraus.

Mit freundlichem Gruß

Lost-Ha[n]f-PHP

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo Lost-Ha[n]f-PHP,

ich denke, du musst für jedes Schlüsselwort prüfen, ob es mit einem Buchstaben beginnt und wenn ja, dann ist das \b als Trenner ja weiterhin ok. Aber wenn das Schliüsselwort nicht mit einem Buchstaben beginnt, dann lass das \b einfach weg, weil dann das Schlüsselwort an jeder Stelle auftauchen kann und nicht nur an den von dir genannten.

Analog für das Ende jeden Schlüsselworts.

Ausprobieren kannst du die Pattern mit On-the-fly Regex-Tester: Regex-Lab.

Außerdem musst du die Schlüsselworte, wenn sie irgendwo Sonderzeichen enthalten, sicherheitshalber mit Regex.Escape behandeln oder aber darauf achten, dass die Schlüsselworte als gültige Regex-Pattern formuliert sind.

Denn <?php als Pattern betrachtet passt nämlich nicht auf <?php, sondern nur auf <php oder php.

herbivore