Forum: PC-Programmierung REGEX Frage zur Ermittlung einer Zeichenkette


von guelay (Gast)


Lesenswert?

Hallo zusammen,

Ich habe das folgende Text als Beispiel:

Aaa.abcd_bcde_jhgk_nameXYZ.ZYC_Values

Ich möchte per Regex und Gruppierungskonstrukt auf den Namen zugreifen, 
d.h. die Zeichenkette "nameXYZ".

Ich habe das folgende Regex: @"_(?<Name>.+).ZYC_Values"

var name = match.Groups["Name"].Value; //würde "bcde_jhgk_nameXYZ.ZYC" 
zurückgeben.


Wie baut man den Regex damit ich als name "nameXYZ" zurück bekommme ? 
Die Zeichenketten zwischen den Sonderzeichen können beliebig lang sein.

von Michael (Gast)


Lesenswert?

@"_(?<Name>[^_]+).ZYC_Values"
Ab dem Unterstrich alles matchen was nicht Unterstrich ist. Gefolgt von 
.ZYC_Values. Btw
 den Punkt solltest du auch noch escapen, da er sonst auch auf andere 
Zeichen matcht...
@"_(?<Name>[^_]+)\.ZYC_Values"

von Theor (Gast)


Lesenswert?

guelay schrieb:
> [...]
>
> Aaa.abcd_bcde_jhgk_nameXYZ.ZYC_Values
>
> Ich möchte per Regex und Gruppierungskonstrukt auf den Namen zugreifen,
> d.h. die Zeichenkette "nameXYZ".
>
> Ich habe das folgende Regex: @"_(?<Name>.+).ZYC_Values"
>
> var name = match.Groups["Name"].Value; //würde "bcde_jhgk_nameXYZ.ZYC"
> zurückgeben.
> [...]

Das hängt damit zusammen, dass der längste Match zurückgeliefert wird.
Du kannst den Suchausdruck gezielter gestalten, in dem Du die '.' und 
'_' berücksichigst.

Etwa: (nicht getestet aber so ungefähr müsste es dem nahekommen)
1
@"[a-zA-Z]+\.[a-zA-Z]+_[a-zA-Z]+_[a-zA-Z]+_(?<Name>.+).ZYC_Values"

von Skyper (Gast)


Lesenswert?

Zum testen und "schauen" bieten sich einige Testseiten für Reguläre 
Ausdrücke an... dort sieht man dann, wo es passt und wo nicht.

Hier, diese nehme ich gerne...  https://regex101.com/

Beitrag #6227881 wurde von einem Moderator gelöscht.
Beitrag #6269202 wurde von einem Moderator gelöscht.
von Minimalist (Gast)


Lesenswert?

guelay schrieb:
> Ich habe das folgende Regex: @"_(?<Name>.+).ZYC_Values"

Bei deinem Ansatz (jetzt mal ungeachtet der Fehler) muss der String auf 
".ZYC_Values" enden. Wenn das schon sicher feststeht, braucht es kein 
Regex mehr. Dann würde ich den String um die letzten 11 Zeichen kürzen, 
und rückwärts bis zum nächsten "_" suchen. Fertig...

in Python bspw:
1
s = "Aaa.abcd_bcde_jhgk_nameXYZ.ZYC_Values"
2
s[:-11].split("_")[-1]

Selbst wenn der letzte Substring hinter dem Punkt eine Variable länge 
hat, ist es m.M.n intuitiver und besser verständlich einfach rückwärts 
zu suchen:
1
s = "Aaa.abcd_bcde_jhgk_nameXYZ.ZYC_Values"
2
s.split(".")[1].split("_")[-1]

Beispiel ist jetzt nur in Python, keine Ahnung was du für eine Sprache 
benutzt...

von Minimalist (Gast)


Lesenswert?

Sorry, das 2. Beispiel war gemogelt, weil streng genommen von vorne 
gesucht wird. Funktioniert aber auch, solange vorne nicht weitere Punkte 
"." eingefügt werden.
Für die Peniblen unter euch:

s.split(".")[-2].split("_")[-1]

So wir der Substring VOR dem letzten Punkt genommen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.