2009-09-16 34 views

Trả lời

51

Không có cách nào dễ dàng để thực hiện việc này bằng cách sử dụng string.Split. (Vâng, ngoại trừ việc chỉ định tất cả các hoán vị của chuỗi phân chia cho mỗi chữ cái viết hoa/chữ thường trong một mảng - không phải rất tao nhã, tôi nghĩ bạn sẽ đồng ý.)

Tuy nhiên, Regex.Split nên thực hiện công việc khá độc đáo.

Ví dụ:

var parts = Regex.Split(input, "aa", RegexOptions.IgnoreCase); 
+0

Tôi đã không nghe nói về Regex.Split() ... cảm ơn! –

+0

Không sao cả. Và vâng, đó là một trong những viên đá quý ẩn giấu trong khung công tác. – Noldorin

+0

Visual Basic thực hiện điều này một cách dễ dàng (với 'Strings.Split') ... Tôi có thực sự hối tiếc khi chuyển sang C# không? – beppe9000

5

Trong thuật toán của bạn, bạn có thể sử dụng phương pháp String.IndexOf và vượt qua trong OrdinalIgnoreCase như tham số StringComparison.

+1

Vì vậy, không có cách nào để tận dụng lợi thế của String.Split? – jdelator

4

Câu trả lời của tôi không tốt bằng Noldorin's, nhưng tôi sẽ để nó để mọi người có thể thấy phương pháp thay thế. Điều này không tốt cho các phân chia đơn giản, nhưng nó linh hoạt hơn nếu bạn cần thực hiện phân tích cú pháp phức tạp hơn.

using System.Text.RegularExpressions; 

string data = "asdf aA asdfget aa uoiu AA"; 
string aaRegex = "(.+?)[aA]{2}"; 

MatchCollection mc = Regex.Matches(data, aaRegex); 

foreach(Match m in mc) 
{ 
    Console.WriteLine(m.Value); 
} 
5

Nếu bạn không quan tâm đến trường hợp, sau đó điều đơn giản nhất để làm là buộc các chuỗi cho tất cả các chữ hoa hoặc chữ thường trước khi sử dụng phân chia.

stringbits = datastring.ToLower().Split("aa") 

Nếu bạn quan tâm đến trường hợp của các bit thú vị của chuỗi nhưng không phải là tách thì tôi sẽ sử dụng String.Replace để buộc tất cả các dải phân cách để một trường hợp cụ thể (trên hoặc dưới, không quan trọng) và sau đó gọi String.Split bằng cách sử dụng trường hợp phù hợp cho dấu phân cách.

strinbits = datastring.Replace("aA", "aa").Replace("AA", "aa").Split("aa") 
2

Đây không phải là phiên bản người đẹp mà còn hoạt động:

"asdf aA asdfget aa uoiu AA".Split(new[] { "aa", "AA", "aA", "Aa" }, StringSplitOptions.RemoveEmptyEntries); 
+0

Vâng, đây là những gì tôi có nghĩa là bởi hoán vị - nó trở nên khá cồng kềnh cho các chuỗi phân chia dài hơn. – Noldorin

1
public static List<string> _Split(this string input,string[] splt) 
    { 
     List<string> _Result=new List<string>(); 
     foreach(string _splt in splt) 
     { 
      if (splt.Count() == 1) 
      { 
       _Result.AddRange(Regex.Split(input, _splt, RegexOptions.IgnoreCase).ToList()); 
      } 
      else 
      { 
       List<string> NewStr = Regex.Split(input, _splt, RegexOptions.IgnoreCase).ToList(); 
       foreach(string _NewStr in NewStr) 
       { 
        List<string> NewSplt = splt.ToList(); 
        NewSplt.Remove(_splt); 
        return _Split(_NewStr, NewSplt.ToArray()); 
       } 
      } 
     } 
     return _Result; 
    } 

sau đó sử dụng chức năng này như dưới đây

public frmThematicConversation() 
{ 
    InitializeComponent(); 
    string str = "a b c d e f g h a b c f a d c b f"; 
    string[] splt = { "a", "b" }; 
    List<string> _result = str._Split(splt); 
} 
Các vấn đề liên quan