| 

.NET C# Java Javascript Exception

2
Da muss es doch was geben um einen String wie "Der Fuchs rennt um den Bau" in Teile zu zerlegen, also Wörter. Das gleiche brauche ich dann aber auch noch, indem ich nach einer bestimmten Anzahl an Buchstaben teile.
29.09.2011
Postel 21 1 2
4 Antworten
6
Das Aufteilen in eine bestimmte Anzahl Zeichen kann gut mit einer Regular Expression erledigt werden:
string s = "Der Fuchs rennt um den Bau";
Regex exp = new Regex(@"...|.*", RegexOptions.IgnoreCase);
MatchCollection matchList = exp.Matches(s);
IEnumerable<string> stringParts = (from Match match in matchList
select match.Value);

Zum Testen die Ausgabe:
foreach (string stringPart in stringParts)
{
Console.WriteLine(stringPart);
}


PS: Anstatt LINQ
IEnumerable<string> stringParts = (from Match match in matchList
select match.Value);

kann auch foreach verwendet werden:
foreach (Match match in matchList)
{
stringParts.Add(match.Value);
}


EDIT:
Ich habe hier 3 Zeichen zur Trennung verwendet. Das kann selbstverständlich beliebig sein.
29.09.2011
Jürgen Luhr 7,1k 1 9
Die Lösung mit RegEx ist interessant! +1
Wäre ich so nie drauf gekommen :D
Floyd 29.09.2011
+1 Sehr schön ausformuliert :)
puls200 29.09.2011
Danke für die Blumen :)
Jürgen Luhr 29.09.2011
Zu erwähnen seit noch das MatchCollection nur IEnumerable(nicht generisch) ist,also wer es lieber mit Lamda macht muss erst Casten: var stringParts = matchList.Cast<Match>().Select((p)=>p.Value);
Thomas Sczyrba 30.09.2011
4
string blub = "Der Fuchs rennt um den Bau";
string[] woerter = blub.Split(' ');

Flexibler ist allerdings die Verwendung Regulärer Ausdrücke.
29.09.2011
puls200 3,8k 7
Das wird so nicht funktionieren. Die Split-Methode hat keine Überladung, welche einen einzelnen String als Parameter entgegen nimmt. Versuche es mit Split(' ') anstatt Split(" ").
dkson 29.09.2011
Danke für den Hinweis. Wenn die "Beitrag editieren" funktionieren würde könnte ich das jetzt verbessern.. ;-)
puls200 29.09.2011
Funktioniert doch ;)
Floyd 29.09.2011
Tatsächlich. Es funktioniert. Endlich! :)))
puls200 29.09.2011
Ich meine das die "Beitrag editieren"-Funktion funktioniert ;)
Floyd 30.09.2011
Auch hier sind wir einer Meinung. Aber jetzt wird's ein bisschen spitzfindig ;-)
puls200 30.09.2011
2
Da muss es doch was geben um einen String wie "Der Fuchs rennt um den Bau" in Teile zu zerlegen, also Wörter.

var s = "Der Fuchs rennt um den Bau";
var woerterliste = s.Split(' ');

Das gleiche brauche ich dann aber auch noch, indem ich nach einer bestimmten Anzahl an Buchstaben teile.

//Für Leute, die LINQ nutzen, um ihre Gedanken in Code umzusetzen :-)
var s = "Der Fuchs rennt um den Bau";
var teillaenge = 6;
var teile = Enumerable.Range(0, s.Length)
.Where(i => i % teillaenge == 0)
.Select(i => s.Substring(i, Math.Min(teillaenge, s.Length - i)));
29.09.2011
dkson 44 1
1
Den ersten Teil deine Frage hat puls200 bereits perfekt beantwortet.
Nun zu deiner Zweiten Frage:

Wie man einen String nach einer bestimmten Anzahl an Buchstaben teilt

string blub = "Der Fuchs rennt um den Bau";
int charCount = 6;
List<string> parts = new List<string>();

for(int i = 0; i < Math.Ceiling((double)blub.Length/charCount); i++){
parts.Add(blub.Substring(i * charCount, Math.Min(charCount, blub.Length - (i * charCount))));
}

//Inhalt von parts:
// Der Fu
// chs re
// nnt um
// den B
// au


Ein paar Besonderheiten will ich erklären:

for(int i = 0; i < Math.Ceiling((double)blub.Length/charCount); i++){

Math.Ceiling liefert den nächsten ganzzahligen Wert der größer oder gleich der übergebenen Zahl ist. Da sich "blub" in 4.33.. Teile a 6 Buchstaben zerlegen lässt musst du also 5 Durchlaufe durch die Schleife machen um alle Teile zu extrahieren. (Der letzte Teil des Strings ist somit nur 2 Zeichen lang)
Der Cast auf "double" ist notwendig da Math.Ceiling sowohl eine Signatur mit einem double als auch ein decimal Parameter hat und der Compiler wissen will, welche von beide er verwenden soll.

blub.Substring(i * charCount, Math.Min(charCount, blub.Length - (i * charCount)))

String.Substring erwartet 2 Parameter. Den Startindex und die Länge. Da die Länge des letzten Blocks aber nur 33% (=^ 0.33..) von 6 (charCount) beträgt (also 2 Zeichen, nämlich "au"), brauchen wir hier Math.Min welches die kleine von 2 übergebenen Zahlen zurückgibt. Für Math.Min nehmen wir als Parameter die gewünschte Länge der Teile (charCount) und die tazächlich noch zur verfügungstehende Länge des Strings ( blub.Length - (i * charCount) ).
29.09.2011
Floyd 14,6k 3 9
Floyd 14,6k 3 9
2
Das liefert ein gutes Ergebnis wenn man Leerzeichen bzw. Whitespace als eigener Buchstabe einordnet. Möchte man das nicht ist es mit Regex sicherlich leichter.
Grüße,
Daniel
puls200 29.09.2011
Stimmt, stand aber auch nicht in der Anforderung ;)
Floyd 29.09.2011
@puls200: Die gleiche Idee hatte ich auch und war gerade am Tippen während du den Kommentar schriebst ;)
Jürgen Luhr 29.09.2011

Stelle deine String-Frage jetzt!