C# Regex Greedy vs Lazy

pizza4ever

Lt. Commander
Dabei seit
Apr. 2009
Beiträge
1.557
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:

BeBur

Lt. Commander
Dabei seit
Nov. 2018
Beiträge
1.146
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/
 

RalphS

Lt. Commander
Dabei seit
Feb. 2015
Beiträge
1.478
regex bitte bitte in Codetags!

CB frißt Asterisken zur Formatierung. Damit kann man nix anfangen.
 

pizza4ever

Lt. Commander
Ersteller dieses Themas
Dabei seit
Apr. 2009
Beiträge
1.557
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
 

Dalek

Ensign
Dabei seit
Jan. 2008
Beiträge
133
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.
 

bog

Ensign
Dabei seit
Apr. 2008
Beiträge
204
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.*?)(\.|_)
 
Top