2011-01-13 82 views
13

Tôi muốn chia chuỗi có dấu phân cách nhưng vẫn giữ dấu phân tách trong kết quả.Tách chuỗi bằng dấu phân cách nhưng giữ dấu phân cách trong kết quả trong C#

Làm cách nào để thực hiện điều này trong C#?

+4

Đối với "a | b", bạn có muốn "a |" +" b "hoặc" a "+" | b "hoặc" a | "+" | b "hoặc cái gì khác? Tóm lại: phân khúc nào có dấu phân cách thuộc về? –

+0

Giữ các dấu phân cách trong kết quả nào? Bạn muốn dấu phân tách như là một phần của mỗi chuỗi được tách ra? Câu hỏi của bạn khá mơ hồ. –

+0

Hey, tôi muốn loại bỏ một chuỗi từ một danh sách các ký tự và kết quả của chuỗi cũng sẽ chứa các dấu phân tách. Như một gợi ý từ veggerby dưới đây là một cái gì đó mà tôi muốn đạt được. Tôi sẽ kiểm tra nó đầu tiên \ – olidev

Trả lời

17

Nếu bạn muốn delimiter là "chia riêng" của nó, bạn có thể sử dụng Regex.Split ví dụ:

string input = "plum-pear"; 
string pattern = "(-)"; 

string[] substrings = Regex.Split(input, pattern); // Split on hyphens 
foreach (string match in substrings) 
{ 
    Console.WriteLine("'{0}'", match); 
} 
// The method writes the following to the console: 
// 'plum' 
// '-' 
// 'pear' 
+0

Xin chào. Cảm ơn. Đây là những gì tôi muốn. Tôi sẽ kiểm tra nó trước. Cảm ơn. Nhưng liệu có cách nào tốt hơn là sử dụng Regex? – olidev

+0

Xin chào, vì các mẫu của tôi là ví dụ: char [] chars = new char [] {'A', 'B', 'C'}. Nó có thể được sử dụng Split từ Regex cho mảng char của tôi thay vì các mẫu chuỗi? Cảm ơn trước – olidev

+0

hi, nếu mẫu của tôi chứa 4 toán tử: +, -, * và/Làm thế nào nó trông như thế nào? Cảm ơn – olidev

2

tôi muốn nói là cách dễ nhất để thực hiện điều này (trừ đối số Hans Kesting lớn lên) là chia chuỗi theo cách thông thường, sau đó lặp lại trên mảng và thêm dấu phân cách vào mọi phần tử nhưng cuối cùng.

+2

Điều này chỉ hoạt động nếu bạn có 1 dấu phân cách. Nếu tôi muốn chia nhỏ khoảng trắng * và * dòng mới, tôi đã thắng ' t biết để thêm – thomas88wp

0

tôi muốn làm một chuỗi multiline như thế này nhưng cần thiết để giữ cho các ngắt dòng vì vậy tôi đã làm điều này

string x = 
@"line 1 {0} 
line 2 {1} 
"; 

foreach(var line in string.Format(x, "one", "two") 
    .Split("\n") 
    .Select(x => x.Contains('\r') ? x + '\n' : x) 
    .AsEnumerable() 
) { 
    Console.Write(line); 
} 

sản lượng

line 1 one 
line 2 two 
0

tôi đi qua cùng một vấn đề nhưng với nhiều dấu phân cách. Đây là giải pháp của tôi:

public static string[] SplitLeft(this string @this, char[] delimiters, int count) 
    { 
     var splits = new List<string>(); 
     int next = -1; 
     while (splits.Count + 1 < count && (next = @this.IndexOfAny(delimiters, next + 1)) >= 0) 
     { 
      splits.Add(@this.Substring(0, next)); 
      @this = new string(@this.Skip(next).ToArray()); 
     } 
     splits.Add(@this); 
     return splits.ToArray(); 
    } 

mẫu với tách CamelCase tên biến:

var variableSplit = variableName.SplitLeft(
    Enumerable.Range('A', 26).Select(i => (char)i).ToArray()); 
3

phiên bản này không sử dụng LINQ hoặc Regex và vì vậy nó có thể là tương đối hiệu quả. Tôi nghĩ rằng nó có thể dễ sử dụng hơn Regex bởi vì bạn không phải lo lắng về việc thoát khỏi các dấu phân cách đặc biệt. Nó trả về một IList<string> hiệu quả hơn việc chuyển đổi thành một mảng. Đó là một phương pháp mở rộng, thuận tiện. Bạn có thể chuyển vào các dấu phân tách dưới dạng mảng hoặc nhiều tham số.

/// <summary> 
/// Splits the given string into a list of substrings, while outputting the splitting 
/// delimiters (each in its own string) as well. It's just like String.Split() except 
/// the delimiters are preserved. No empty strings are output.</summary> 
/// <param name="s">String to parse. Can be null or empty.</param> 
/// <param name="delimiters">The delimiting characters. Can be an empty array.</param> 
/// <returns></returns> 
public static IList<string> SplitAndKeepDelimiters(this string s, params char[] delimiters) 
{ 
    var parts = new List<string>(); 
    if (!string.IsNullOrEmpty(s)) 
    { 
     int iFirst = 0; 
     do 
     { 
      int iLast = s.IndexOfAny(delimiters, iFirst); 
      if (iLast >= 0) 
      { 
       if (iLast > iFirst) 
        parts.Add(s.Substring(iFirst, iLast - iFirst)); //part before the delimiter 
       parts.Add(new string(s[iLast], 1));//the delimiter 
       iFirst = iLast + 1; 
       continue; 
      } 

      //No delimiters were found, but at least one character remains. Add the rest and stop. 
      parts.Add(s.Substring(iFirst, s.Length - iFirst)); 
      break; 

     } while (iFirst < s.Length); 
    } 

    return parts; 
} 

Một số xét nghiệm đơn vị:

text = "[a link|http://www.google.com]"; 
result = text.SplitAndKeepDelimiters('[', '|', ']'); 
Assert.IsTrue(result.Count == 5); 
Assert.AreEqual(result[0], "["); 
Assert.AreEqual(result[1], "a link"); 
Assert.AreEqual(result[2], "|"); 
Assert.AreEqual(result[3], "http://www.google.com"); 
Assert.AreEqual(result[4], "]"); 
+0

Đây là một giải pháp tốt.Làm thế nào về nếu delimiter của tôi là một chuỗi? Bạn có thể vui lòng cung cấp một thực hiện đó là tốt. – nishantvodoo

0

Để tránh thêm nhân vật để dòng mới thử điều này:

string[] substrings = Regex.Split(input,@"(?<=[-])"); 
Các vấn đề liên quan