Bir dizeyi C # 'da başka bir dizeye bölme


682

Split()Dizeleri bölmek için yöntemi kullanıyorum , ama bu sadece bir karakter bir karakterle bölüyorsanız çalışır gibi görünüyor. A'yı bölmenin bir yolu var mı string, başka bir dize parametreyle bölünüyor mu?

Ben şanssız bir karakter dizisine splitter dönüştürme denedim.

Başka bir deyişle, şunu bölmek istiyorum string:

THExxQUICKxxBROWNxxFOX

tarafından xx, ve değerleri ile bir dizi dönüş:

HIZLI KAHVERENGİ TİLKİ


2
Gelecekteki endişeler için: Aşağıdaki yorumlardan biri beni ilgilendirdi, bu yüzden kabul edilen cevapta sezgisel olmayan (ancak doğru) yolla ilgili yazılım mühendisliği hakkında bir tartışma başlatmaya karar verdim .
scharette

Yanıtlar:


1239

Bir dizeye bölmek için aşırı dize dizisi kullanmanız gerekir .

string data = "THExxQUICKxxBROWNxxFOX";

return data.Split(new string[] { "xx" }, StringSplitOptions.None);

4
Aslında buna cevabımı 2 nedenden dolayı değiştirdim: # 1: Yapmak istediğim bölünmeleri işlemek için Regex.Escape kullanmalıyım, çünkü bölünmüş dizem genellikle yıldız vb. İçerecektir. # 2: Bu program sırasında Ben yazma gerçek bir optimizasyon ihtiyacı yok, orada ek yükü Regex Split yöntemini kullanarak dahil gibi görünüyor.
Brandon

7
@Peter: Bu yazı Jon'un posterin sabit bir sınırlayıcısı olmadığı için önerdiğini; "birden fazla boşluk" (2+ anlamına gelir) ile ayrılmış dizeleri ayırmak istiyor. Değer yerine desenle ayrılmış dizeler için RegEx harika ( tek , tek ) bir seçenektir. Sabit değerli sınırlayıcılar için gereksiz ek yük getirir. Bir test çalıştırmayı deneyin; işlemlerin sayısı arttıkça, RegEx buna karşılık ~ 10x civarında bir yer kaplar . string.Split
Adam Robinson

9
Python'dan C #'a geliyorum. Python, başka bir dizeye bölünmüş dizeyi destekler. Ve basit bir cevap için bu soruya sık sık geri dönmem gerekiyor string[] Split(string pattern), ki bu aklıma gelen en doğal kullanım değil, orada değil. Daha önce C yazdım, bu yüzden dizilere alışkınım ama char[]aniden dikkatimi akış seviyesinden bayt seviyesine sürüklediğinden hala bir C # kodunda patlamaktan nefret ediyorum . Herkes neden C # kütüphane çocuklar Split yöntemini böyle tasarladı biliyor? İyi bir neden varsa, rahatsızlığa rağmen muhtemelen takdir etmeye çalışabilirim.
foresightyj

11
Bu snippet, C # geliştiricileri için göstermekten utanacağım şeyler listesinde çok yüksek.
Traubenfuchs

99
Neden yapamıyoruz data.Split("xx")?
mcont

122

Dizeleri alan bir aşırı Split var.

"THExxQUICKxxBROWNxxFOX".Split(new [] { "xx" }, StringSplitOptions.None);

Bu StringSplitOptions öğelerinden birini kullanabilirsiniz

  • None - Dönüş değeri, boş bir dize içeren dizi öğelerini içerir
  • RemoveEmptyEntries - Dönüş değeri, boş bir dize içeren dizi öğelerini içermiyor

Eğer dize "THExxQUICKxxxxBROWNxxFOX" StringSplitOptions.Noneise, dizide "xxxx" kısmı için boş bir giriş döndürür StringSplitOptions.RemoveEmptyEntries.


73
Regex.Split(string, "xx")

genellikle bunu yapmamın yolu.


Tabii ki ihtiyacınız olacak:

using System.Text.RegularExpressions;

veya:

System.Text.RegularExpressions.Regex.Split(string, "xx")

ama sonra yine o kütüphaneye her zaman ihtiyacım var.


13
@Brandon: Genellikle erken optimizasyona karşı uyarıda bulunsam da, düzenli ifade yükü nedeniyle a'nın RegEx.Splitbir basitten biraz daha maliyetli olduğunu bilmelisiniz String.Split.
Adam Robinson

9
İsteğe bağlı bir dizeyle bölmek istiyorsanız Regex.Escape, önce dizede kullanın , bu herhangi bir normal ifade meta karakterlerinden kaçacaktır.
Richard

ek yük için ödeyebilecek en önemli avantajlardan biri dize karşılaştırma ayarı sağlama yeteneğidir
Timur Sadykov


25

Genelde bunun için kendi uzantımı kullanmayı seviyorum:

string data = "THExxQUICKxxBROWNxxFOX";
var dataspt = data.Split("xx");
//>THE  QUICK  BROWN  FOX 


//the extension class must be declared as static
public static class StringExtension
{   
    public static string[] Split(this string str, string splitter)
    {
        return str.Split(new[] { splitter }, StringSplitOptions.None);
    }
}

Bununla birlikte, Microsoft bu yöntem aşırı yüklemesini sonraki sürümlere dahil etmeye karar verirse, bu bir İstisnaya neden olur. Microsoft'un bu yöntemi bu arada içermemesinin olası nedeni de: Çalıştığım en az bir şirket, tüm C # projelerinde böyle bir uzantı kullandı.

Ayrıca, yöntemi çalışma zamanında koşullu olarak tanımlamak da mümkün olabilir.


4
Alternatif params string[] splitterolarak, ikinci parametre olarak kullanın ve birden çok sınırlayıcıyı desteklemek new[] {splitter}için splitterolarak değiştirin .
Matthew Strawbridge

10

Önceki cevapların hepsi doğrudur. Bir adım daha ileri gidip Dize üzerinde bir uzantı yöntemi tanımlayarak benim için C # yapmak :

public static class Extensions
{
    public static string[] Split(this string toSplit, string splitOn) {
        return toSplit.Split(new string[] { splitOn }, StringSplitOptions.None);
    }
}

Bu şekilde safça ilk kez bunu gerçekleştirmek için çalıştı beklediğim basit bir şekilde herhangi bir dize çağırabilirsiniz:

"a big long string with stuff to split on".Split("g str");


7
string data = "THExxQUICKxxBROWNxxFOX";

return data.Replace("xx","|").Split('|');

Değiştirme karakterini dikkatli bir şekilde seçmeniz yeterlidir (dizede bulunma olasılığı düşük bir karakter seçin)!


2
@MasoudHosseini: Lütfen cevabın tamamını okuyun; zaten bir feragatname var.
SNag

3
@kobe: Çünkü bu korkunç bir hack.
Overv

3
İyi çalışıyor, ancak genel yöntemler için tehlikeli
Kaizonaro

5
"Bu korkunç bir hack" veya "kötü bir yanıt" gibi açıklamalar göndermek yardımcı olmaz. Sadece açıklama olmadan bir görüş. Bunun yerine, "Dizeyi yerine koymak için taramak ve ardından düşük performansa neden olduğu için bölünmüş karakterleri taramak gereksizdir." kendinizi açıklamanın daha iyi bir yolu olurdu. Çok fazla programcı bu şekilde hareket ediyor. :(
Matt Ruwe

1
Dize |char zaten içeriyorsa, bu nedenle kullanmak tehlikeli olduğunu düşünüyorum.
amd

-1

Bu da kolaydır:

string data = "THExxQUICKxxBROWNxxFOX";
string[] arr = data.Split("xx".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);

1
Ama bu aynı zamanda bölünmesini "THExQUICK"istemediğimiz yere de bölünür
Rafalon

Teşekkürler Rafalon: evet, Greg en iyi cevaptır: data.Split (yeni dize [] {"xx"}, StringSplitOptions.RemoveEmptyEntries)
user890255

-4

En kolay yol String.Replace:

string myString = "THExxQUICKxxBROWNxxFOX";
mystring = mystring.Replace("xx", ", ");

Veya daha basit:

string myString = "THExxQUICKxxBROWNxxFOX".Replace("xx", ", ");

3
Olduğu gibi, bu bir dizi döndürmez (soru istediği gibi), sadece xx's olan virgüllerle bir dize .
Arj

Ve sadece dize ek virgül içeriyorsa, kelimeleri doğru şekilde ayıramazsınız.
user3658298
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.