C# String zerschneiden?
Hallo,
Ich habe mal eine kleine Frage zu c#:
Nämlich wenn ich die
string.split
Methode nutze wird ja das Original Zeichen gelöscht, also das Zeichnen mit dem aufgeteilt wird.
Wie mache ich jetzt dass das Original Zeichen nicht gelöscht wird?
4 Antworten
Die am leichtesten verständliche Möglichkeit wäre, ein neues Array aufzubauen, in das abwechselnd das Substring und das Token eingetragen werden.
-----
Habe es gerade noch einmal ausprobiert:
System.Text.RegularExpressions.Regex.Split
nimmt "Gruppen" mit hinein in das Array. Letztlich ist das ein inkonsistentes Verhalten - m. E. gehört das in die RegExOptions hinein -, aber immerhin erspart das ein wenig Mühe.
Folgendes Progrämmchen
// See https://aka.ms/new-console-template for more information
using System.Text.RegularExpressions;
// token = "___"
Regex regex1 = new Regex(@"(___)");
string originalText1 = "abc___def___ghi___jkl___";
string[] splitText1 = regex1.Split(originalText1);
Console.WriteLine("{\"" + string.Join("\", \"", splitText1) + "\"}");
// token1 = "___", token2 = "+++"
Regex regex2 = new Regex(@"(___|\+\+\+)");
string originalText2 = "abc___def+++ghi___jkl+++";
string[] splitText2 = regex2.Split(originalText2);
Console.WriteLine("{\"" + string.Join("\", \"", splitText2) + "\"}");
(beachte die Klammern um das Token auch in regex1!)
liefert
{"abc", "___", "def", "___", "ghi", "___", "jkl", "___", ""}
{"abc", "___", "def", "+++", "ghi", "___", "jkl", "+++", ""}
Falls du die "Tokens" in einem Array von Strings (string[]), einer List<string> oder allgemein in einem IEnumerable<string> hast, kannst du den regulären Ausdruck wie folgt aufbauen:
new Regex("("+String.Join("|",tokens.Select(s => Regex.Escape(s)).ToArray())+")")
Regex.Escape kümmert sich dann um die nötigen Backslashes (wie in meinem Beispiel die Backslashes vor den +-Zeichen)
Regex.Split("abcxdef", @"(?=x)|(?<=x)")
Anstatt "abcxdef" natürlich deinen eigenen String und anstatt x den gewünschten Delimiter.
Liefert in dem Beispiel zurück: ["abc", "x", "def"]. Ich denke das ist, was du willst.
Du brauchst dafür diesen Import, aber das sollte deine IDE normal von selbst einfügen:
using System.Text.RegularExpressions;
Danke. Du hast genau das beantwortet was ich gefragt hab.
Eine kleine Frage: kann man es auch mit mehreren x machen?
str ist die Original-Zeichenfolge, die im Array tokens steht das Ergebnis.
string[] tokens = str.Split(new[] { "Trennzeichenfolge" }, StringSplitOptions.None);
P.S. Zwischen den {} können auch mehrere Trennzeichen (mit , getrennt) angegeben werden.
Ähm, bei mir wird das Zeichen immer noch abgeschnitten.
public void Main(string[] args)
{
string test = "abcd(efg)hijk{lmn}opq,rst,uvw";
var Result = test.SplitWithDelim(",");
foreach (var word in Result)
Console.WriteLine(word);
Console.ReadKey();
}
public IEnumerable<string> SplitWithDelim(this string @this, string Delimiter)
{
List<string> Result = new List<string>();
var Tokens = @this.Split(new[] { Delimiter }, StringSplitOptions.None).ToList();
foreach (var word in Tokens)
{
Result.Add(word);
Result.Add(Delimiter);
}
Result.RemoveAt(Result.Count - 1);
return Result;
}
Danke das funktioniert