แยกสตริงด้วยสตริงอื่นใน C #


682

ฉันใช้Split()วิธีการแยกสตริง แต่วิธีนี้ใช้ได้เฉพาะเมื่อคุณแยกสตริงด้วยอักขระ มีวิธีการแยก a stringโดยมีสตริงอื่นที่แบ่งตามพารามิเตอร์หรือไม่

ฉันพยายามแปลงตัวแยกเป็นชุดอักขระโดยไม่มีโชค

กล่าวอีกนัยหนึ่งฉันต้องการแยกstring:

THExxQUICKxxBROWNxxFOX

โดยxxและส่งคืนอาร์เรย์ด้วยค่า:

THE QUICK, BROWN, FOX


2
สำหรับความกังวลในอนาคต: หนึ่งในด้านล่างความคิดเห็นผมสนใจดังนั้นผมจึงตัดสินใจที่จะเปิดอภิปรายในวิศวกรรมซอฟต์แวร์เกี่ยวกับการnonintuitive ( แต่ขวา) วิธีที่จะทำมันในคำตอบที่ได้รับการยอมรับ
scharette

คำตอบ:


1239

เพื่อที่จะแยกด้วยสตริงคุณจะต้องใช้เกินสตริงอาร์เรย์

string data = "THExxQUICKxxBROWNxxFOX";

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

4
จริง ๆ แล้วฉันก็เปลี่ยนคำตอบของฉันด้วยเหตุผลสองประการ: # 1: เพื่อจัดการแยกฉันต้องการฉันจะต้องใช้ Regex.Escape เพราะสตริงแยกของฉันมักจะมีเครื่องหมายดอกจัน ฯลฯ # 2: ในขณะที่โปรแกรมนี้ ฉันเขียนไม่ต้องการการเพิ่มประสิทธิภาพที่แท้จริงดูเหมือนจะมีค่าใช้จ่ายเพิ่มเติมที่เกี่ยวข้องกับการใช้วิธีการแยก Regex
Brandon

7
@Peter: ในโพสต์นั้นจอนแนะนำเพราะโปสเตอร์ไม่มีตัวคั่นคงที่ เขาต้องการแยกสตริงที่คั่นด้วย "มากกว่าหนึ่งช่องว่าง" (หมายถึง 2+) สำหรับสตริงที่คั่นด้วยรูปแบบแทนที่จะเป็นค่า RegEx เป็นตัวเลือกที่ยอดเยี่ยม (อย่างเดียวเท่านั้น ) สำหรับตัวคั่นค่าคงที่แนะนำค่าใช้จ่ายที่ไม่จำเป็น ลองทำการทดสอบ เป็นตัวเลขของการดำเนินงานเพิ่มขึ้น RegEx จบลงด้วยการสละบางรอบ ~ 10 string.Splitเท่าตราบใดที่สอดคล้องกัน
อดัมโรบินสัน

9
ฉันมาจาก Python ถึง C # Python รองรับการแบ่งสตริงด้วยสตริงอื่น และบ่อยครั้งที่ฉันต้องกลับมาที่คำถามนี้เพื่อหาคำตอบง่ายๆstring[] Split(string pattern)ซึ่งเป็นการใช้งานที่เป็นธรรมชาติที่สุดที่ฉันสามารถนึกได้ ฉันเขียน C มาก่อนดังนั้นฉันจึงคุ้นเคยกับการจัดเรียงอาร์เรย์ แต่ฉันยังคงเกลียดที่จะเห็นการchar[]โผล่ขึ้นมาในรหัส C # เพราะจู่ ๆ ก็ดึงความสนใจของฉันจากระดับกระแสถึงระดับไบต์ ไม่มีใครรู้ว่าทำไมพวกห้องสมุด C # จึงออกแบบวิธีแยกเช่นนี้ หากมีเหตุผลที่ดีฉันอาจลองชื่นชมมันได้แม้จะไม่สะดวก
foresightyj

11
ตัวอย่างนี้มีอันดับสูงมากในรายการสิ่งที่ฉันรู้สึกละอายใจที่จะแสดงต่อผู้พัฒนาที่ไม่ใช่ C #
Traubenfuchs

99
ทำไมนรกเราทำdata.Split("xx")ไม่ได้?
mcont

122

มีการโอเวอร์โหลดของการแยกที่ใช้สตริง

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

คุณสามารถใช้ StringSplitOptions อย่างใดอย่างหนึ่งเหล่านี้

  • ไม่มี - ค่าส่งคืนรวมองค์ประกอบของอาร์เรย์ที่มีสตริงว่าง
  • RemoveEmptyEntries - ค่าส่งคืนไม่รวมองค์ประกอบอาร์เรย์ที่มีสตริงว่าง

ดังนั้นหากสตริงคือ "THExxQUICKxxxxBROWNxxFOX" StringSplitOptions.Noneจะส่งคืนรายการว่างในอาร์เรย์สำหรับส่วน "xxxx" ในขณะที่StringSplitOptions.RemoveEmptyEntriesจะไม่


73
Regex.Split(string, "xx")

เป็นวิธีที่ฉันทำตามปกติ


แน่นอนคุณจะต้อง:

using System.Text.RegularExpressions;

หรือ :

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

แต่อีกครั้งฉันต้องการห้องสมุดนั่นตลอดเวลา


13
@Brandon: ในขณะที่ฉันมักจะเตือนเกี่ยวกับการเพิ่มประสิทธิภาพก่อนวัยอันควรคุณควรตระหนักว่า a RegEx.Splitค่อนข้างแพงกว่าง่ายกว่าเล็กน้อยString.Splitเนื่องจากค่าใช้จ่ายในการแสดงออกปกติ
อดัมโรบินสัน

9
หากคุณต้องการแยกโดยสตริงที่กำหนดให้ใช้Regex.Escapeกับสตริงก่อนซึ่งจะเป็นการยกเว้นเมตาอักขระ Regex ใด ๆ
ริชาร์ด

หนึ่งในข้อได้เปรียบที่สำคัญที่อาจจ่ายสำหรับค่าใช้จ่ายคือความสามารถในการตั้งค่าการเปรียบเทียบสตริง
Timur Sadykov

47

มีเกินของString.Splitสำหรับสิ่งนี้:

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

1
คำตอบเดียวที่จะลบการประกาศประเภทอาเรย์ที่ไม่มีความจำเป็น
wonea

25

โดยทั่วไปฉันต้องการใช้ส่วนขยายของตัวเองเพื่อ:

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

อย่างไรก็ตามสิ่งนี้จะนำไปสู่ข้อยกเว้นหาก Microsoft ตัดสินใจที่จะรวมการโอเวอร์โหลดเมธอดนี้ในเวอร์ชันที่ใหม่กว่า นอกจากนี้ยังเป็นสาเหตุที่ทำให้ Microsoft ไม่ได้รวมวิธีนี้ในเวลาเดียวกัน: อย่างน้อยหนึ่ง บริษัท ที่ฉันทำงานให้ใช้ส่วนขยายดังกล่าวในโครงการ C # ทั้งหมดของพวกเขา

นอกจากนี้ยังอาจเป็นไปได้ที่จะกำหนดวิธีตามเงื่อนไขที่รันไทม์หากไม่มีอยู่


4
หรือใช้params string[] splitterเป็นพารามิเตอร์ที่สองและการเปลี่ยนแปลงnew[] {splitter}ที่จะsplitterให้การสนับสนุนหลายตัวคั่น
Matthew Strawbridge

10

คำตอบก่อนหน้านี้ถูกต้องทั้งหมด ฉันไปอีกขั้นหนึ่งและทำให้ C # ทำงานให้ฉันโดยกำหนดวิธีการขยายใน String:

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

ด้วยวิธีนี้ฉันสามารถเรียกมันบนสายใด ๆ ในวิธีที่ง่ายฉันคาดหวังอย่างไร้เดียงสาในครั้งแรกที่ฉันพยายามทำสิ่งนี้ให้สำเร็จ:

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


7
string data = "THExxQUICKxxBROWNxxFOX";

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

เพียงเลือกตัวอักขระแทนที่อย่างระมัดระวัง (เลือกอันที่ไม่น่าจะมีอยู่ในสตริงแล้ว)!


2
@MasoudHosseini: โปรดอ่านคำตอบที่สมบูรณ์; มีข้อจำกัดความรับผิดชอบอยู่แล้ว
SNag

3
@kobe: เพราะมันเป็นแฮ็คที่แย่มาก
โอเวอร์

3
ทำงานได้ดี แต่มันอันตรายสำหรับวิธีการทั่วไป
Kaizonaro

5
การโพสต์คำอธิบายเช่น "เป็นแฮ็คที่แย่มาก" หรือ "คำตอบไม่ดี" ไม่เป็นประโยชน์ มันเป็นเพียงความเห็นโดยไม่มีคำอธิบาย ให้ระบุบางอย่างเช่น "ไม่จำเป็นที่จะต้องสแกนทั้งสตริงเพื่อแทนที่แล้วสแกนหาอักขระที่แยกจากกันเพราะจะทำให้ประสิทธิภาพลดลง" จะเป็นวิธีที่ดีกว่าที่จะอธิบายตัวเอง โปรแกรมเมอร์มากเกินไปทำหน้าที่นี้ :(
Matt Ruwe

1
ถ้าสตริงมี|ถ่านอยู่แล้วด้วยเหตุนี้ฉันคิดว่ามันอันตรายที่จะใช้
amd

-1

นี่เป็นเรื่องง่าย:

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

1
แต่สิ่งนี้จะแยกออกจากกัน"THExQUICK"ซึ่งเราไม่ต้องการให้ถูกแยกออก
Rafalon

ขอบคุณ Rafalon: ใช่ Greg เป็นคำตอบที่ดีที่สุด: data.Split (สตริงใหม่ [] {"xx"}, StringSplitOptions.RemoveEmptyEntries)
user890255

-4

วิธีที่ง่ายที่สุดคือใช้String.Replace:

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

หรือมากกว่านั้น:

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

3
ตามที่เป็นอยู่นี้จะไม่ส่งคืนอาร์เรย์ (ตามคำถามที่ถาม) เพียงแค่สตริงที่มีเครื่องหมายจุลภาคที่xxมีอยู่
Arj

และไม่เพียงแค่นั้นหากสตริงมีเครื่องหมายจุลภาคเพิ่มเติมคุณจะไม่สามารถแยกคำได้อย่างถูกต้อง
user3658298
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.