C# Regex Greedy vs Lazy

pizza4ever

Lt. Commander
Registriert
Apr. 2009
Beiträge
1.665
Hallo,

ich habe eine Frage zum Regex Match:

Das Beispiel:

AE0xxxx_TF-yyyy-059_1.PNG mit dem Pattern:

Code:
(.*_)(TF.*)([.]|_)
soll an der ERSTEN Fundstelle von
Code:
([.]|_)
stoppen

d.h. in dem Beispiel soll die Gruppe $2

TF-yyyy-059

und nicht (wie im oberen Regex)

TF-yyyy-059_1

zurückgeben.

Was mache ich falsch?

Danke,

Alex
 
Zuletzt bearbeitet:
Kenne jetzt nicht speziell C# regexp, aber würde mich wundern, wenn das so anders ist:
Einzelne Zeichen nicht in eckige Klammern setzen.
Der Punkt gibt doch nur einen match für einzelne Zeichen. Wo bekommst du da diese ganzen Zeichenketten raus?
Im ersten regexp scheint der Unterstrich zu fehlen.
Kopier doch mal den zuletzt passenden regexp mit code-tags ins forum rein: https://regex101.com/
 
regex bitte bitte in Codetags!

CB frißt Asterisken zur Formatierung. Damit kann man nix anfangen.
 
Sorry, habe das in Codetags gesetzt.

ein besseres Beispiel ist vielleicht:


AE0xxxx_TF-yyyy-059_1.PNG.png.png.png

$3 ist = TF-yyyy-059_1.PNG.png.png

ich will aber, dass beim ersten vorkommen von
_ ODER . gestoppt wird,

also

TF-yyyy-059
 
Generell ist es besser nicht .* zu verwenden wenn man nicht greedy matchen will. Du willst ja nicht alles matchen in diesem Fall, sondern nur alles außer deinem Trennzeichen (Punkt oder Underscore). Also würde ich die Regular Expression auch genaus so schreiben:

Code:
([^_]*_)(TF[^_.]*)(\.|_)

Der wichtige Teil ist [^_.]*, das matcht alle Zeichen außer Punkt und Underscore beliebig oft. Das kann daher aber nicht über einen Punkt oder Underscore hinaus matchen, sondern wird dort immer stoppen.
 
  • Gefällt mir
Reaktionen: BeBur und pizza4ever
das beispiel von @Dalek zeigt die sauberere methodik, das einzufangen.

der komplettheit halber kannst du repeating expressions (+, *) non-greedy schalten, indem du ein fragezeichen dahinter kloppst. ansonsten sind die eigentlich (?) immer greedy.
also sowas in richtung:
Code:
(.*_)(TF.*?)(\.|_)
 
Zurück
Oben