Làm cách nào để phân tách một chuỗi bởi một dấu phân cách nhiều ký tự trong C #?


232

Điều gì xảy ra nếu tôi muốn tách một chuỗi bằng cách sử dụng một dấu phân cách là một từ?

Ví dụ , This is a sentence.

Tôi muốn tách ra isvà nhận Thisa sentence.

Trong Java, tôi có thể gửi một chuỗi như một dấu phân cách, nhưng làm thế nào để tôi thực hiện điều này trong C#?

Câu trả lời:


281

http://msdn.microsoft.com/en-us/l Library / system.opes.split.aspx

Ví dụ từ các tài liệu:

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
Điều này thực sự trả về: 'Th' '' 'một câu' với ví dụ được đưa ra trong câu hỏi. Có lẽ đây là những gì anh ấy thực sự muốn, nhưng nó không phải là những gì anh ấy chỉ định.
IRBMe

6
Đây chỉ là một ví dụ ... Vấn đề là: Có một String.Split lấy các chuỗi làm dấu phân cách.
bruno conde

1
Có, nhưng nó không làm những gì câu hỏi chỉ định. Bạn phải sử dụng một cái gì đó thông minh hơn một chút để có được đầu ra được chỉ định. Bây giờ, cho dù những gì câu hỏi được chỉ định thực sự là những gì người hỏi muốn là một câu hỏi khác nhau, nhưng câu hỏi được hỏi ở đây không thể được trả lời một cách tầm thường chỉ với String.Split.
IRBMe

3
Vẫn không hoạt động. Nếu bạn bao gồm các khoảng trắng trong từ cần chia, chúng sẽ không được bao gồm trong đầu ra. Nếu bạn xem xét ví dụ được đưa ra trong câu hỏi, bạn sẽ nhận thấy rằng trên thực tế chúng bao gồm các khoảng trắng. Chia tách trên "là" sẽ cung cấp cho bạn "Điều này" và "một câu" thay vì "Điều này" và "một câu". Lưu ý các khoảng trắng tinh tế ở cuối "Điều này" và bắt đầu của "một câu". Một lần nữa, câu trả lời này có lẽ là những gì người hỏi thực sự muốn, nhưng đó không phải là những gì anh ta hỏi và, tôi nhắc lại, String.Split sẽ không giải quyết một cách tầm thường.
IRBMe

2
@IRBMe bạn đã đọc câu hỏi chưa? 'Tôi muốn tách ra "là". Vì vậy, tôi sẽ nhận được "Điều này" và "một câu" '. Xem khoảng trắng trong kết quả ??? Đây là những gì tuyệt vời mà Split làm.
bruno conde

55

Bạn có thể sử dụng phương thức Regex.Split , đại loại như thế này:

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

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

Chỉnh sửa : Điều này thỏa mãn ví dụ bạn đã đưa ra. Lưu ý rằng một String.Split thông thường cũng sẽ phân tách trên " is " ở cuối từ "This", do đó tại sao tôi sử dụng phương thức Regex và bao gồm các ranh giới từ xung quanh " is ". Tuy nhiên, lưu ý rằng nếu bạn vừa viết ví dụ này bị lỗi, thì String.Split có thể sẽ đủ.


@ EDIT: Tôi cũng không chắc, nhưng bạn vẫn có thể sử dụng phân tách chuỗi bình thường và chỉ cần khoảng trắng ở hai bên nếu mục tiêu của anh ấy là CHỈ xóa từ "là".
ahawker

1
Điều đó cũng không hoạt động (ít nhất là không phải không có nhiều nỗ lực hơn), bởi vì bạn không biết liệu không gian nên đi bên trái, bên phải hay cả hai mà không biết vị trí của từ được phân tách trong chuỗi .
IRBMe

Có vẻ quá phức tạp vì String.Splity cho phép bạn tách trên một chuỗi đã ...
Ed S.

3
Tôi đã giải quyết vấn đề này trong phần chỉnh sửa cho câu trả lời của mình, trong phần bình luận ở trên và trong 3 bình luận về một câu trả lời khác. String.Split không hoạt động cho ví dụ được cung cấp trong câu hỏi. Tôi sẽ không lặp lại lần nữa bằng cách giải thích tại sao. Bạn có thể đọc tất cả các ý kiến ​​khác nếu bạn muốn biết.
IRBMe

lưu ý rằng phương thức phân chia regex không loại bỏ dấu phân cách trước và dấu phân cách dấu trên biến ... :(
melaos

34

Dựa trên các phản hồi hiện có trên bài đăng này, điều này giúp đơn giản hóa việc thực hiện :)

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, điều này hét lên cho một phương pháp mở rộng. Gần như ngớ ngẩn rằng đây không phải là một trong những quá tải tích hợp.
Todd Menier

9
@ToddMenier Ý bạn là gì "gần như"?
hướng về

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

EDIT: "is" được đệm ở cả hai bên với khoảng trắng trong mảng để duy trì thực tế là bạn chỉ muốn từ "được" xóa khỏi câu và từ "này" vẫn còn nguyên.


8

...Nói ngắn gọn:

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

5

Bạn có thể sử dụng String.Replace () để thay thế chuỗi phân tách mong muốn của mình bằng một ký tự không xuất hiện trong chuỗi và sau đó sử dụng String.Split trên ký tự đó để phân tách chuỗi kết quả cho cùng một hiệu ứng.


5

Hoặc sử dụng mã này; (giống nhau: Chuỗi mới [])

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

3

Đây là một hàm mở rộng để thực hiện phân tách bằng dấu tách chuỗi:

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

Ví dụ về cách sử dụng:

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
Trước khi đăng mã, có lẽ bạn nên thử chạy mã thông qua trình biên dịch trước, trừ khi bạn biểu thị rằng bạn chưa có. Có một dấu chấm phẩy bị thiếu từ dòng đầu tiên và str1 & str2 không được xác định. Chưa kể rằng mã không thực sự hoạt động như thế nào OP muốn. Mã này chia nó thành "Th" và "dễ dàng hơn nhiều".
mandreko
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.