Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Gelöschter Benutzer

unregistriert

1

13.10.2012, 12:49

Regex-Suche (C#)

Hallo,
ich probiere gerade etwas mit Regular Expressions herum, komme aber an folgender Stelle nicht weiter:

C#-Quelltext

1
2
Regex regex = new Regex("<ab>(.*?)</ab>");
Match match = regex.Match("<ab>Hello regex!</ab>");


match.Value beinhaltet immer den Inhalt des Eingabe-Strings (also "<ab>Hello regex!</ab>"). Ich möchte in aber das haben, was zwischen dem "ab"-Tags steht (also hier "Hello regex!").
Was mache ich falsch?

Viele Grüße

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

2

13.10.2012, 12:55

Du machst nichts falsch, hast nur einen Denkfehler. Auch Buchstabenfolgen gehören zu regulären Ausdrücken. Es wird geguckt in deinem String eine Zeichenfolge zu finden welche deinem Pattern entspricht. Dein Pattern möchte aber nun mal das Tag + Inhalt haben. Ist aber an sich auch nicht schlimm. Wenn du den Inhalt haben möchtest, dann musst du die den Substring daraus holen. Den Anfang des Strings kennst du, da am Anfang immer "<ab>" steht. Du kennst die Länge vom String durch .Length und du kennst die Zeichen am Ende "</ab>". Damit kannst du dir ganz einfach den Substring holen. Die Methode SubString gibt es schon. Die Parameter kannst du dir ganz einfach berechnen. Versuch das erst mal.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

3

13.10.2012, 13:05

< und > sowie diverse Buchstaben haben Bedeutungen im Regex. Du müsstest also noch maskieren \< usw. Und eigentlich brauchst du das ? nicht, aber mit dem Regex ist es schon etwas her ^^ (und auch nur in PHP).

Tobiking

1x Rätselkönig

  • Private Nachricht senden

4

13.10.2012, 14:00

Was du willst ist das was zwischen den () steht. Das sind Groups, die entsprechend in match.Groups stehen.

< und > sowie diverse Buchstaben haben Bedeutungen im Regex. Du müsstest also noch maskieren \< usw. Und eigentlich brauchst du das ? nicht, aber mit dem Regex ist es schon etwas her ^^ (und auch nur in PHP).

Die < und > haben soweit ich weiß nur im Kontext mit named Groups eine Bedeutung und können sonst problemlos verwendet werden. Und das .*? ist auch richtig. Der Ausdruck .* ist greedy und nimmt daher soviel er kriegen kann bevor im Ausdruck weiter geguckt wird. In den Beispiel ergebe das "Hello regex!</ab>". Der Gesamtausdruck matcht dann nicht mehr, weil das extra angegebene "</ab>" nicht mehr erfüllt wird. Das ".*?" ist lazy und nimmt nur solange Zeichen bis der Teilausdruck dahinter matcht.

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

5

13.10.2012, 14:25

Hmm ja wie gesagt ist länger her... ich hatte das immer mit Modifern gemacht, allerdings waren meine Strings auch komplizierter.

6

13.10.2012, 17:37

Toni: Ob mit oder ohne Fragezeichen macht beim hier genannten Beispiel keinen Unterschied. Auch .* matched. Ein Unterschied ist erst feststellbar, wenn </ab> zweimal im Suchstring vorkommt: Mit Fragezeichen ist nach dem ersten Schluss, ohne nachdem letzten.
"Theory is when you know something, but it doesn’t work. Practice is when something works, but you don’t know why. Programmers combine theory and practice: Nothing works and they don’t know why." - Anon

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

7

13.10.2012, 18:18

Um das zu machen, was du eigentlich willst, kannst du auch um Substring und co zu vermeiden, sogennante "Look-around assertions" verwenden.
Das ist wohl etwas eleganter. Sonst kannst du gleich im String selbst suchen.

Werbeanzeige