C# String von X bis Y innerhalb eines langen Strings

max_1234

Captain
Registriert
Feb. 2012
Beiträge
3.682
Ich bin furchtbar mit Titeln!
Folgendes:

Ich habe mehrere String die ich so geliefert bekomme:
sdfsdf2344234sdfsdfsd,a123,b234423,c1452345,d21345623534,e1245234,45635345sdfsdf234234

Die Länge der einzelnen Sektionen ist nicht vorhersehbar.
Ich möchte den rot markierten bereich nun entnehmen.
Das Einzige das hierbei gleich bleibt ist der Anfangsbuchstabe, wobei dieser in einigen anderen Sektionen auch vorkommen "kann".
Glücklicherweise steht vor dem Anfangsbuchstaben "c" immer ein Komma, wodurch man schon mal nach ",c" suchen kann.

Nun das eigentliche Problem: Da die Anzahl der Zahlen nach ",c" unterschiedlich sein kann, wie kann ich exakt bis zum nächsten Kommafiltern/greppen?

Das riecht ganz streng nach RegEx, da bin ich allergisch gegen :D
Natürlich ist jeder Ansatz willkommen - an sowas bin ich schon öfters mal hängen geblieben.

mfg,
Max
 
Zuletzt bearbeitet:
Kannst auch einfach bei ',' splitten (was übrigens kein Semikolon, sondern ein Komma ist), und dann mit beginsWith oder so ähnlich checken ob eins der Teile mit c anfängt, wenn ja haste dein String und bist fertig.

Edit:
Es ist die StartsWith-Methode
Also so ähnlich hier:
Array = String.split(",");
Array durchlaufen und prüfen ob Element mit c startet, gefunden, fertig!
 
Zuletzt bearbeitet von einem Moderator:
Und wie mach ich das nur bis zum nächsten "Komma"?
Meine Lösung war etwa 8 Zeilen lang ..... :D

Bei deinem Beispielcode können auch andere Fragmente des Strings zurückgeliefert werden .. leider.

Glaub hab das bissl blöd erklärt:
VON ",c" BIS zum nächsten ","

Kommas und c's kommen mehrfach vor, deshalb haut das mit einer einfachen substr bzw. split Methode leider nicht hin :(
Da die Menge der Zahlen nach dem ",c" auch variabel sind geht das auch nicht mit einer statischen Lösung ...
 
Zuletzt bearbeitet:
Es gibt in C# garantiert eine InString()-Funktion (heißt vermutlich etwas anders ;) ). Wie der dödel jedoch schon korrekt gesagt hat, trennst du am besten den String am Trennzeichen ','. Die Methode dafür heißt irgendwas mit Split(), schau mal was du am String-Objekt findest.

Du bekommst eine Art von Liste zurück (Dictionary, Array, ...) durch die du dann iterieren kannst (for each in oder schlicht for 0 to List.Length-1) und solange läufst, bis das erste Zeichen ein 'c' ist.

[Nachtrag]
Das das Trennzeichen beliebig oft vorkommen kann, ist klar. Entsprechend kann der getrennte Inhalt natürlich auch beliebig oft mit 'c' anfangen. Das ist aber ein generelles Problem, was du auch mit einem RegEx nicht beheben kannst, da du den genauen Suchstring ja gar nicht kennst. Ein Split ist also weiterhin die beste Methode, bei Bedarf eben eine extra Liste anlegen, die du dann mit allen 'c'-Inhalten befüllst.
 
Zuletzt bearbeitet:
Erm ja, doch das geht ...
Habs nun etwas kompakter hinbekommen, habe allerdings auf einen RegEx Gott gehofft :D

string a ="sdfsdf2344234sdfsdfsd,a123,b234423,c1452345,d21345623534,e1245234,45635345sdfsdf234234";
string b = a.Substring(a.IndexOf(",c") + 1); //sdfsdf2344234sdfsdfsd,a123,b234423,c1452345,d21345623534,e1245234,45635345sdfsdf234234
string c = b.Substring(0, b.IndexOf(","));
//c1452345,d21345623534,e1245234,45635345sdfsdf234234
Resultat: c1452345

mfg,
Max
 
Zuletzt bearbeitet:
Code:
            string kommaString = "sdfsdf2344234sdfsdfsd,a123,b234423,c1452345,d21345623534,e1245234,45635345sdfsdf234234";
            string[] arrStr = kommaString.Split(new Char[] { ',' });

            foreach (var item in arrStr)
            {
                if (item.StartsWith("c"))
                    Console.WriteLine(item);
            }
            Console.ReadLine();
 
Regex: ,c[\w]*[,]*

Dann musst du aber noch die Kommas beachten, also den Index immer bei 1 anfangen zu zählen und nur bis Länge-1 gehen.
(oder halt erstes und letztes Zeichen abschnibbeln)
 
Was? Wenn du einfach immer am Kommata teilst, bekommst du danach ein Array. In diesem Array stehen Strings:

Array[0] = sdfsdf2344234sdfsdfsd
Array[1] = a123
Array[2] = b234423
Array[3] = c1452345
Array[4] = d21345623534
Array[5] = e1245234
Array[6] = 45635345sdfsdf234234

Jetzt wird mit einer Schleife durch dieses Array iteriert und dabei von den Strings jeweils der erste Buchstabe überprüft. Wenn der gleich c ist, dann nehme Array als Ergebnis.
 
Dank den ganzen LINQ Extension Methods extrem simpel:
Code:
string instr = "...";
IEnumerable<string> s = instr
  .Split( new string[] { "," }, StringSplitOptions.None )
  .Where( c => c.StartsWith( "c" ) );
 
Merci für alle Antworten :)

Leider kann der erste ([0]) SubString auch mit "c" anfangen, weshalb hier eine weitere Prüfung notwendig wäre und weshalb die Kombination ",c" schon Sinn macht :P
Das RegEx ,c[\w]*[,]* habe ich grad getestet, funktioniert super!
Aber gibt es vllt. hier noch ne Möglichkeit im RegEx selbst den ersten und letzten Char wegzulassen?

mfg,
Max
 
Zuletzt bearbeitet:
@max_1234:
Das hier geht auch:
Code:
string a ="sdfsdf2344234sdfsdfsd,a123,b234423,c1452345,d21345623534,e1245234,45635345sdfs df234234";
string b = a.Substring(a.IndexOf(",c") + 1).Split(',')[0];
Aber nur wenn wirklich noch ein Komma kommt. Ansonsten schlägts auf.
 
Zurück
Oben