Wie teile ich eine Zeichenfolge durch ein Trennzeichen aus mehreren Zeichen in C #?

232

Was ist, wenn ich eine Zeichenfolge mit einem Trennzeichen teilen möchte, das ein Wort ist?

Beispielsweise, This is a sentence .

Ich möchte mich trennen isund bekommen Thisunda sentence .

In Javakann ich eine Zeichenfolge als Trennzeichen senden, aber wie kann ich dies in erreichen C#?

Saobi
quelle

Antworten:

281

http://msdn.microsoft.com/en-us/library/system.string.split.aspx

Beispiel aus den Dokumenten:

string source = "[stop]ONE[stop][stop]TWO[stop][stop][stop]THREE[stop][stop]";
string[] stringSeparators = new string[] {"[stop]"};
string[] result;

// ...
result = source.Split(stringSeparators, StringSplitOptions.None);

foreach (string s in result)
{
    Console.Write("'{0}' ", String.IsNullOrEmpty(s) ? "<>" : s);
}
bruno conde
quelle
7
Dies gibt tatsächlich zurück: 'Th' '' 'ein Satz' mit dem in der Frage angegebenen Beispiel. Vielleicht ist es das, was er tatsächlich will, aber es ist nicht das, was er spezifiziert hat.
IRBMe
6
Dies ist nur ein Beispiel ... Der Punkt ist: Es gibt einen String.Split, der Strings als Trennzeichen verwendet.
Bruno Conde
1
Ja, aber es macht nicht das, was die Frage angibt. Sie müssen etwas clevereres verwenden, um die angegebene Ausgabe zu erhalten. Ob die angegebene Frage tatsächlich das ist, was der Fragesteller möchte, ist eine andere Frage, aber die hier gestellte Frage kann nicht einfach mit String.Split beantwortet werden.
IRBMe
3
Funktioniert immer noch nicht ganz. Wenn Sie die zu teilenden Leerzeichen in das Wort aufnehmen, werden sie nicht in die Ausgabe aufgenommen. Wenn Sie das in der Frage angegebene Beispiel untersuchen, werden Sie feststellen, dass sie tatsächlich die Leerzeichen enthalten. Das Aufteilen auf "ist" würde Ihnen "Dies" und "einen Satz" geben, anstatt "Dies" und "einen Satz". Beachten Sie die subtilen Leerzeichen am Ende von "Dies" und am Anfang von "Ein Satz". Auch diese Antwort ist wahrscheinlich das, was der Fragesteller tatsächlich will, aber es ist nicht das, was er gefragt hat, und ich wiederhole, String.Split wird es nicht trivial lösen.
IRBMe
2
@IRBMe hast du die Frage gelesen? 'Ich möchte auf "ist" teilen. Also werde ich "Dies" und "einen Satz" bekommen. Siehe die Leerzeichen in den Ergebnissen ??? Genau das macht Split.
Bruno Conde
55

Sie können die Regex.Split- Methode wie folgt verwenden:

Regex regex = new Regex(@"\bis\b");
string[] substrings = regex.Split("This is a sentence");

foreach (string match in substrings)
{
   Console.WriteLine("'{0}'", match);
}

Bearbeiten : Dies entspricht dem Beispiel, das Sie gegeben haben. Beachten Sie, dass ein gewöhnlicher String.Split auch am " ist " am Ende des Wortes "Dies" aufgeteilt wird, weshalb ich die Regex- Methode verwendet und die Wortgrenzen um das " ist " eingeschlossen habe. Beachten Sie jedoch, dass String.Split wahrscheinlich ausreicht , wenn Sie dieses Beispiel nur irrtümlich geschrieben haben.

IRBMe
quelle
@ EDIT: Ich war mir auch nicht sicher, aber Sie können immer noch den normalen String-Split verwenden und nur Leerzeichen auf beiden Seiten auffüllen, wenn sein Ziel darin besteht, NUR das Wort "ist" zu entfernen.
Ahawker
1
Das funktioniert auch nicht (zumindest nicht ohne viel mehr Aufwand), da Sie nicht wissen, ob das Leerzeichen links, rechts oder beides stehen soll, ohne die Positionen des Wortes zu kennen, das in der Zeichenfolge aufgeteilt wurde .
IRBMe
Scheint zu kompliziert, da String.Splity es Ihnen ermöglicht, bereits auf einem String zu teilen ...
Ed S.
3
Ich habe dies bereits in meiner Bearbeitung auf meine Antwort, im obigen Kommentar und in 3 Kommentaren zu einer anderen Antwort angesprochen. String.Split funktioniert für das in der Frage angegebene Beispiel nicht. Ich werde mich nicht noch einmal wiederholen, indem ich erkläre, warum. Sie können alle anderen Kommentare lesen, wenn Sie wissen möchten.
IRBMe
Beachten Sie, dass die Regex-Split-Methode das Prä-Trennzeichen und das
nachfolgende
34

Basierend auf den vorhandenen Antworten zu diesem Beitrag vereinfacht dies die Implementierung :)

namespace System
{
    public static class BaseTypesExtensions
    {
        /// <summary>
        /// Just a simple wrapper to simplify the process of splitting a string using another string as a separator
        /// </summary>
        /// <param name="s"></param>
        /// <param name="pattern"></param>
        /// <returns></returns>
        public static string[] Split(this string s, string separator)
        {
            return s.Split(new string[] { separator }, StringSplitOptions.None);
        }


    }
}
eka808
quelle
9
+1, das schreit nach einer Erweiterungsmethode. Fast albern, dass dies keine der eingebauten Überlastungen ist.
Todd Menier
9
@ToddMenier Was meinst du mit "fast"?
Mwardm
28
string s = "This is a sentence.";
string[] res = s.Split(new string[]{ " is " }, StringSplitOptions.None);

for(int i=0; i<res.length; i++)
    Console.Write(res[i]);

BEARBEITEN: Das "ist" wird auf beiden Seiten mit Leerzeichen im Array aufgefüllt, um die Tatsache beizubehalten, dass nur das Wort "wird" aus dem Satz entfernt werden soll und das Wort "dies" intakt bleiben soll.

ahawker
quelle
8

...Zusamenfassend:

string[] arr = "This is a sentence".Split(new string[] { "is" }, StringSplitOptions.None);
ParPar
quelle
5

Sie können String.Replace () verwenden, um die gewünschte geteilte Zeichenfolge durch ein Zeichen zu ersetzen, das in der Zeichenfolge nicht vorkommt, und dann String.Split für dieses Zeichen verwenden, um die resultierende Zeichenfolge für denselben Effekt zu teilen.

Paul Sonier
quelle
5

Oder verwenden Sie diesen Code; (gleich: neuer String [])

.Split(new[] { "Test Test" }, StringSplitOptions.None)
Cagdas
quelle
3

Hier ist eine Erweiterungsfunktion, um den Split mit einem String-Trennzeichen durchzuführen:

public static string[] Split(this string value, string seperator)
{
    return value.Split(new string[] { seperator }, StringSplitOptions.None);
}

Anwendungsbeispiel:

string mystring = "one[split on me]two[split on me]three[split on me]four";
var splitStrings = mystring.Split("[split on me]");
SteveD
quelle
0
var dict = File.ReadLines("test.txt")
               .Where(line => !string.IsNullOrWhitespace(line))
               .Select(line => line.Split(new char[] { '=' }, 2, 0))
               .ToDictionary(parts => parts[0], parts => parts[1]);


or 

    enter code here

line="[email protected][email protected]";
string[] tokens = line.Split(new char[] { '=' }, 2, 0);

ans:
tokens[0]=to
token[1]=xxx@gmail.com=yyy@yahoo.co.in
Prabu
quelle
-5
string strData = "This is much easier"
int intDelimiterIndx = strData.IndexOf("is");
int intDelimiterLength = "is".Length;
str1 = strData.Substring(0, intDelimiterIndx);
str2 = strData.Substring(intDelimiterIndx + intDelimiterLength, strData.Length - (intDelimiterIndx + intDelimiterLength));
Susmeet Khaire
quelle
19
Bevor Sie Code veröffentlichen, sollten Sie ihn wahrscheinlich zuerst über einen Compiler ausführen, es sei denn, Sie geben an, dass Sie dies nicht getan haben. In der ersten Zeile fehlt ein Semikolon, und str1 & str2 sind nicht definiert. Ganz zu schweigen davon, dass der Code nicht so funktioniert, wie es das OP wollte. Dieser Code teilt es in "Th" und "ist viel einfacher".
Mandreko