Jak podzielić ciąg przez wieloznakowy ogranicznik w C #?


232

Co jeśli chcę podzielić ciąg znaków za pomocą separatora, który jest słowem?

Na przykład This is a sentence.

Chcę się podzielić, isdostać Thisi a sentence.

W Javamogę wysłać w ciągu znaków jako ogranicznik, ale w jaki sposób to osiągnąć w C#?

Odpowiedzi:


281

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

Przykład z dokumentów:

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);
}

7
To faktycznie zwraca: „Th” „” zdanie ”z przykładem podanym w pytaniu. Być może tego właśnie chce, ale nie tego określił.
IRBMe

6
To tylko przykład ... Chodzi o to: istnieje String.Split, który przyjmuje łańcuchy jako ograniczniki.
bruno conde

1
Tak, ale nie robi tego, co określa pytanie. Musisz użyć czegoś bardziej sprytnego, aby uzyskać określony wynik. Otóż, to, czy określone pytanie jest w rzeczywistości tym, czego chce pytający, jest innym pytaniem, ale na pytanie zadane tutaj nie można odpowiedzieć trywialnie za pomocą String.Split.
IRBMe

3
Wciąż nie działa. Jeśli w wyrazie zostanie uwzględnione spacje do podziału, nie zostaną one uwzględnione w wynikach. Jeśli przeanalizujesz przykład podany w pytaniu, zauważysz, że w rzeczywistości zawierają spacje. Podział na „jest” dałby „To” i „zdanie” zamiast „To” i „zdanie”. Zwróć uwagę na subtelne spacje na końcu „To” i na początku „zdania”. Ponownie, ta odpowiedź jest prawdopodobnie tym, czego faktycznie pytający pyta, ale nie jest tym, o co pytał i, powtarzam, String.Split nie rozwiąże trywialnie.
IRBMe

2
@IRBMe przeczytałeś pytanie? „Chcę podzielić na„ is ”. Dostanę więc „To” i „zdanie”. Zobacz spacje w wynikach ??? Właśnie to robi Split.
bruno conde

55

Możesz użyć metody Regex.Split , coś takiego:

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

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

Edycja : Spełnia podany przykład. Zauważ, że zwykły String.Split również podzieli się na „ jest ” na końcu słowa „To”, dlatego zastosowałem metodę Regex i zawarłem granice słów wokół „ jest ”. Pamiętaj jednak, że jeśli właśnie napisałeś ten przykład przez pomyłkę, prawdopodobnie String.Split prawdopodobnie wystarczy.


@ EDIT: Ja też nie byłem pewien, ale nadal możesz używać normalnego podziału struny i po prostu wstawiać spacje po obu stronach, jeśli jego celem jest WYŁĄCZNIE usunięcie słowa „jest”.
ahawker

1
To też nie działa (przynajmniej nie bez większego wysiłku), ponieważ nie wiesz, czy spacja powinna iść po lewej, prawej czy obu, nie znając pozycji słowa, które zostało podzielone na ciąg .
IRBMe

Wydaje się zbyt skomplikowane, ponieważ String.Splity pozwala już rozdzielić się na sznurku ...
Ed S.,

3
Zaadresowałem to już w mojej edycji do mojej odpowiedzi, w powyższym komentarzu oraz w 3 komentarzach do innej odpowiedzi. String.Split nie działa w przykładzie podanym w pytaniu. Nie zamierzam się powtarzać, wyjaśniając dlaczego. Możesz przeczytać wszystkie pozostałe komentarze, jeśli chcesz wiedzieć.
IRBMe

zauważ, że metoda dzielenia
wyrażeń

34

W oparciu o istniejące odpowiedzi w tym poście upraszcza to wdrażanie :)

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);
        }


    }
}

9
+1, to krzyczy o metodę rozszerzenia. Niemal głupie, że nie jest to jeden z wbudowanych przeciążeń.
Todd Menier

9
@ToddMenier Co masz na myśli mówiąc „prawie”?
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]);

EDYCJA: „Jest” jest obustronnie dopełnione spacjami w tablicy, aby zachować fakt, że chcesz tylko, aby słowo „zostało” usunięte ze zdania, a słowo „to” pozostało nienaruszone.


8

...W skrócie:

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

5

Możesz użyć String.Replace (), aby zastąpić pożądany ciąg podzielony znakiem, który nie występuje w ciągu, a następnie użyć String.Split na tym znaku, aby podzielić wynikowy ciąg dla tego samego efektu.


5

Lub użyj tego kodu; (same: nowy Ciąg [])

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

3

Oto funkcja rozszerzenia do dzielenia za pomocą separatora ciągów:

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

Przykład użycia:

string mystring = "one[split on me]two[split on me]three[split on me]four";
var splitStrings = mystring.Split("[split on me]");

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="to=xxx@gmail.com=yyy@yahoo.co.in";
string[] tokens = line.Split(new char[] { '=' }, 2, 0);

ans:
tokens[0]=to
token[1]=xxx@gmail.com=yyy@yahoo.co.in

-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));

19
Przed opublikowaniem kodu prawdopodobnie powinieneś najpierw spróbować uruchomić go za pomocą kompilatora, chyba że zaznaczysz, że go nie masz. W pierwszym wierszu brakuje średnika, a str1 i str2 nie są zdefiniowane. Nie wspominając o tym, że kod nie działa tak, jak chciał PO. Ten kod dzieli go na „Th” i „jest o wiele łatwiejszy”.
mandreko,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.