ฉันจะแยกสตริงด้วยตัวคั่นแบบหลายอักขระใน C # ได้อย่างไร


232

ถ้าฉันต้องการแยกสตริงโดยใช้ตัวคั่นที่เป็นคำ

ตัวอย่างเช่นThis is a sentence.

ฉันต้องการที่จะแยกisและได้รับและThisa sentence

ในJavaฉันสามารถส่งสตริงเป็นตัวคั่น แต่ฉันจะทำสิ่งนี้ได้C#อย่างไร

คำตอบ:


281

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

ตัวอย่างจากเอกสาร:

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
สิ่งนี้จะส่งคืนจริง: 'Th' '' 'ประโยคหนึ่ง' พร้อมตัวอย่างที่ให้ไว้ในคำถาม บางทีนี่อาจเป็นสิ่งที่เขาต้องการ แต่ไม่ใช่สิ่งที่เขาระบุ
IRBMe

6
นี่เป็นเพียงตัวอย่าง ... ประเด็นคือ: มี String.Split ที่รับสายเป็นตัวคั่น
bruno conde

1
ใช่ แต่ไม่ได้ทำในสิ่งที่คำถามระบุ คุณต้องใช้บางสิ่งที่ฉลาดกว่านี้ในการระบุเอาต์พุต ตอนนี้ไม่ว่าสิ่งที่คำถามที่ระบุเป็นจริงสิ่งที่ผู้ถามต้องการเป็นคำถามที่แตกต่างกัน แต่คำถามที่ถามที่นี่ไม่สามารถตอบเพียงแค่ String.Split เล็กน้อย
IRBMe

3
ยังไม่ได้ผล หากคุณรวมช่องว่างในคำที่จะแยกจะไม่รวมอยู่ในผลลัพธ์ หากคุณตรวจสอบตัวอย่างที่ให้ไว้ในคำถามคุณจะสังเกตเห็นว่าในความเป็นจริงแล้วพวกเขารวมถึงช่องว่าง การแยกเป็น "คือ" จะให้ "นี่" และ "ประโยค" แก่คุณแทนที่จะเป็น "นี่" และ "ประโยค" สังเกตช่องว่างที่ส่วนท้ายของ "This" และจุดเริ่มต้นของ "a ประโยค" อีกครั้งคำตอบนี้อาจเป็นสิ่งที่ผู้ถามต้องการ แต่ก็ไม่ใช่สิ่งที่เขาถามและฉันขอย้ำอีกครั้งString.Splitจะไม่แก้ปัญหาได้เล็กน้อย
IRBMe

2
@IRBMe คุณอ่านคำถามหรือไม่ 'ฉันต้องการแยก "เป็น" ดังนั้นฉันจะได้รับ "อันนี้" และ "ประโยค" ดูช่องว่างในผลลัพธ์ ??? นี่คือสิ่งที่ exacly แยกทำ
bruno conde

55

คุณสามารถใช้วิธีRegex.Split ได้ดังนี้:

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

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

แก้ไข : สิ่งนี้เป็นไปตามตัวอย่างที่คุณให้ โปรดทราบว่าสตริงธรรมดาแยกจะแบ่งใน " เป็น " ในตอนท้ายของคำว่า "นี่" ดังนั้นทำไมฉันใช้วิธีRegexและรวมถึงขอบเขตคำรอบ " เป็น " อย่างไรก็ตามโปรดทราบว่าหากคุณเพิ่งเขียนตัวอย่างนี้ด้วยความผิดพลาดString.Splitอาจจะพอเพียง


@ แก้ไข: ฉันไม่แน่ใจเหมือนกัน แต่คุณยังคงสามารถใช้การแบ่งสตริงปกติและเพียงแค่เว้นช่องว่างด้านใดด้านหนึ่งหากเป้าหมายของเขาคือการลบคำว่า "เป็น" เท่านั้น
ahawker

1
มันไม่ได้ผลเช่นกัน (อย่างน้อยก็ไม่ต้องใช้ความพยายามมากนัก) เพราะคุณไม่รู้ว่าช่องว่างควรอยู่ทางซ้ายทางขวาหรือทั้งสองโดยไม่ทราบตำแหน่งของคำที่แยกในสตริง .
IRBMe

ดูเหมือนว่ามีความซับซ้อนมากเกินไปเป็น String.Splity ช่วยให้คุณสามารถแยกสตริงแล้ว ...
เอ็ดเอส

3
ฉันได้แจ้งเรื่องนี้ไว้ในการแก้ไขคำตอบของฉันในความคิดเห็นด้านบนและใน 3 ความคิดเห็นสำหรับคำตอบอื่น String.Splitไม่ทำงานสำหรับตัวอย่างที่ให้ไว้ในคำถาม ฉันจะไม่ทำซ้ำตัวเองอีกครั้งโดยอธิบายว่าทำไม คุณสามารถอ่านความคิดเห็นอื่น ๆ ทั้งหมดหากคุณต้องการทราบ
IRBMe

โปรดทราบว่าวิธีการแยก regex ไม่ได้ลบตัวคั่นล่วงหน้าและตัวคั่นต่อท้ายบนตัวแปร ... :(
melaos

34

จากการตอบกลับที่มีอยู่ของโพสต์นี้ทำให้การติดตั้งง่ายขึ้น :)

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 สิ่งนี้ส่งเสียงร้องสำหรับวิธีการขยาย เกือบจะงี่เง่าว่านี่ไม่ใช่หนึ่งในโอเวอร์โหลดในตัว
ทอดด์ Menier

9
@ToddMenier คุณหมายถึงอะไร "เกือบ"
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]);

แก้ไข: "is" ถูกทับทั้งสองด้านพร้อมช่องว่างในอาร์เรย์เพื่อรักษาความจริงที่ว่าคุณเพียงต้องการให้คำว่า "คือ" ลบออกจากประโยคและคำว่า "นี่" ยังคงไม่บุบสลาย



5

คุณสามารถใช้ String.Replace () เพื่อแทนที่สตริงการแยกที่คุณต้องการด้วยอักขระที่ไม่ได้เกิดขึ้นในสตริงและจากนั้นใช้ String.Split กับตัวละครนั้นเพื่อแยกสตริงผลลัพธ์เป็นเอฟเฟกต์เดียวกัน


5

หรือใช้รหัสนี้ (เหมือนกัน: สตริงใหม่ [])

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

3

นี่คือฟังก์ชั่นส่วนขยายเพื่อทำการแยกด้วยตัวคั่นสตริง:

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

ตัวอย่างการใช้งาน:

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
ก่อนที่จะโพสต์โค้ดคุณควรลองใช้มันผ่านคอมไพเลอร์ก่อนเว้นแต่ว่าคุณไม่ได้ระบุไว้ มีเครื่องหมายอัฒภาคหายไปจากบรรทัดแรกและไม่ได้กำหนด str1 & str2 ไม่ต้องพูดถึงว่ารหัสไม่ทำงานตามที่ OP ต้องการ รหัสนี้แบ่งออกเป็น "Th" และ "ง่ายกว่ามาก"
mandreko
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.