C# String zerschneiden?

PWolff  10.10.2022, 13:19

Willst du das Trennzeichen als eigenes Element im Array haben ("Token") oder an den vorangehenden Teil oder an den nachfolgenden Teil angehängt haben?

theCPP 
Fragesteller
 10.10.2022, 13:20

als eigens Element

4 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

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", "+++", ""}
Woher ich das weiß:Berufserfahrung – Software-Entwickler

theCPP 
Fragesteller
 10.10.2022, 13:51

Danke das funktioniert

0
PWolff  10.10.2022, 15:03
@theCPP

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)

0
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.

Woher ich das weiß:Hobby – Programmieren ist mein Hobby & Beruf

MrAmazing2  10.10.2022, 13:27

Du brauchst dafür diesen Import, aber das sollte deine IDE normal von selbst einfügen:

using System.Text.RegularExpressions;
1
theCPP 
Fragesteller
 10.10.2022, 13:33
@MrAmazing2

Danke. Du hast genau das beantwortet was ich gefragt hab.

1
theCPP 
Fragesteller
 10.10.2022, 13:45
@MrAmazing2

Eine kleine Frage: kann man es auch mit mehreren x machen?

0

str ist die Original-Zeichenfolge, die im Array tokens steht das Ergebnis.

string[] tokens = str.Split(new[] { "Trennzeichenfolge" }, StringSplitOptions.None);

Woher ich das weiß:Berufserfahrung – Studium der Informatik + Softwareentwickler seit 25 Jahren.

Brainchild  10.10.2022, 12:58

P.S. Zwischen den {} können auch mehrere Trennzeichen (mit , getrennt) angegeben werden.

1
theCPP 
Fragesteller
 10.10.2022, 13:04
@Brainchild

Ähm, bei mir wird das Zeichen immer noch abgeschnitten.

0
  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;
   }
Woher ich das weiß:Berufserfahrung – Studium der Informatik + Softwareentwickler seit 25 Jahren.