2008-09-16 20 views
61

Tôi đang thực hiện phân tích cú pháp đầu vào chuỗi đơn giản và tôi cần một trình mã thông báo chuỗi. Tôi mới đến C# nhưng đã lập trình Java, và nó có vẻ tự nhiên mà C# nên có một tokenizer chuỗi. Phải không? Nó đâu rồi? Làm thế nào để tôi sử dụng nó?C# có một Trình mã hoá chuỗi như Java không?

+1

Cùng câu hỏi: http://stackoverflow.com/questions/1134311/c-tokenizer-keeping-the-seperators – Mikhail

Trả lời

110

Bạn có thể sử dụng String.Split method.

class ExampleClass 
{ 
    public ExampleClass() 
    { 
     string exampleString = "there is a cat"; 
     // Split string on spaces. This will separate all the words in a string 
     string[] words = exampleString.Split(' '); 
     foreach (string word in words) 
     { 
      Console.WriteLine(word); 
      // there 
      // is 
      // a 
      // cat 
     } 
    } 
} 

Để biết thêm thông tin, xem Sam Allen's article about splitting strings in c# (Performance, Regex)

3

Tôi nghĩ gần nhất trong .NET Framework là

 
string.Split() 
18

Phương pháp phân chia của một chuỗi là những gì bạn cần. Trong thực tế, lớp mã thông báo trong Java không được sử dụng để ủng hộ phương thức tách chuỗi của Java.

+1

AFAI, nó thực sự phản đối, nhưng không ủng hộ phương thức 'String # split'. Nhiều hay ít ủng hộ lớp 'Scanner'. – bvdb

1

Đối với tách phức tạp bạn có thể sử dụng một regex tạo ra một bộ sưu tập phù hợp.

-2

Nếu bạn đang sử dụng C# 3.5, bạn có thể viết một phương thức mở rộng cho System.String thực hiện việc chia tách mà bạn cần. Sau đó bạn sau đó có thể sử dụng cú pháp:

string.SplitByMyTokens(); 

Thông tin thêm và một ví dụ hữu ích từ MS đây http://msdn.microsoft.com/en-us/library/bb383977.aspx

+10

Đây là một giải pháp cho một vấn đề địa phương, không phải là một hoạt động rõ ràng/mục đích chung System.String. Một lớp tiện ích có thể theo thứ tự, nhưng nó sẽ là lạm dụng phương pháp mở rộng để sử dụng một phương pháp mở rộng ở đây. –

2

sử dụng Regex.Split(string,"#|#");

+4

Tại sao? Điều này làm gì? – EnvisionAndDevelop

17

Tôi chỉ muốn làm nổi bật sức mạnh của phương pháp tách C# và đưa ra một so sánh chi tiết hơn, đặc biệt là từ một người đến từ một backgrou Java nd.

Trong khi StringTokenizer trong Java chỉ cho phép một dấu phân cách duy nhất, chúng ta thực sự có thể chia trên nhiều delimiters làm biểu thức thông thường ít cần thiết (mặc dù nếu người ta cần regex, sử dụng regex bằng mọi cách!) Lấy ví dụ này:

str.Split(new char[] { ' ', '.', '?' }) 

Điều này chia tách trên ba dấu phân cách khác nhau trả về một mảng mã thông báo. Chúng tôi cũng có thể loại bỏ các mảng trống rỗng với những gì sẽ là một tham số thứ hai cho ví dụ trên:

str.Split(new char[] { ' ', '.', '?' }, StringSplitOptions.RemoveEmptyEntries) 

Một điều Chuỗi tokenizer Java không có mà tôi tin rằng C# là thiếu (ít nhất Java 7 có tính năng này) là khả năng để giữ (các) dấu phân cách là mã thông báo. Việc chia tách C# sẽ loại bỏ các mã thông báo. Điều này có thể quan trọng trong việc nói một số ứng dụng NLP, nhưng đối với các ứng dụng có mục đích chung hơn thì điều này có thể không phải là một vấn đề.

2
_words = new List<string>(YourText.ToLower().Trim('\n', '\r').Split(' '). 
      Select(x => new string(x.Where(Char.IsLetter).ToArray()))); 

Hoặc

_words = new List<string>(YourText.Trim('\n', '\r').Split(' '). 
      Select(x => new string(x.Where(Char.IsLetterOrDigit).ToArray()))); 
0

Các tương tự như phương pháp của Java là:

Regex.Split(string, pattern); 

nơi

  • string - văn bản mà bạn cần phải chia
  • pattern - mẫu kiểu chuỗi, nội dung tách văn bản
+0

Hoặc String.Split cho tokenization đơn giản hơn. –

0

Nếu bạn đang cố gắng làm một việc như tách đối số dòng lệnh trong ứng dụng .NET Console, bạn sẽ gặp sự cố vì .NET là bị hỏng hoặc đang cố gắng thông minh (có nghĩa là nó tốt như bị hỏng). Tôi cần thiết để có thể phân tách các đối số bằng ký tự không gian, giữ lại bất kỳ chữ nào được trích dẫn để chúng không bị phân chia ở giữa. Đây là mã tôi đã viết để làm công việc:

private static List<String> Tokenise(string value, char seperator) 
{ 
    List<string> result = new List<string>(); 
    value = value.Replace(" ", " ").Replace(" ", " ").Trim(); 
    StringBuilder sb = new StringBuilder(); 
    bool insideQuote = false; 
    foreach(char c in value.ToCharArray()) 
    { 
     if(c == '"') 
     { 
      insideQuote = !insideQuote; 
     } 
     if((c == seperator) && !insideQuote) 
     { 
      if (sb.ToString().Trim().Length > 0) 
      { 
       result.Add(sb.ToString().Trim()); 
       sb.Clear(); 
      } 
     } 
     else 
     { 
      sb.Append(c); 
     } 
    } 
    if (sb.ToString().Trim().Length > 0) 
    { 
     result.Add(sb.ToString().Trim()); 
    } 

    return result; 
} 
Các vấn đề liên quan