2012-09-12 29 views
5

Tôi có một vấn đề dường như đơn giản của việc tách một dấu phẩy tách String vào thẻ, trong đó sản lượng nên bao gồm thẻ trống trong các trường hợp:Tokenising một String chứa thẻ trống

  • Ký tự đầu tiên trong String là một dấu phẩy .
  • Ký tự cuối cùng trong String là dấu phẩy.
  • Hai dấu phẩy liên tiếp xảy ra.

Ví dụ: đối với String: ",abd,def,,ghi," sẽ cho kết quả đầu ra: {"", "abd", "def", "", "ghi", ""}.

Tôi đã thử sử dụng String.split, ScannerStringTokenizer cho điều này nhưng mỗi cung cấp một đầu ra không mong muốn khác nhau (ví dụ bên dưới). Bất cứ ai có thể đề xuất một giải pháp thanh lịch cho điều này, tốt hơn là sử dụng các lớp JDK? Rõ ràng tôi có thể viết một cái gì đó bản thân mình nhưng tôi cảm thấy như tôi đang thiếu một cái gì đó trên một trong ba cách tiếp cận được đề cập. Lưu ý rằng dấu phân cách là một String cố định mặc dù không nhất thiết là dấu phẩy, cũng không phải là ký tự đơn.

Ví dụ Mã

import java.util.*; 

public class Main12 { 
    public static void main(String[] args) { 
    String s = ",abd,def,,ghi,"; 
    String[] tokens = s.split(","); 

    System.err.println("--- String.split Output ---"); 
    System.err.println(String.format("%s -> %s", s, Arrays.asList(tokens))); 

    for (int i=0; i<tokens.length; ++i) { 
     System.err.println(String.format("tokens[%d] = %s", i, tokens[i])); 
    } 

    System.err.println("--- Scanner Output ---"); 

    Scanner sc = new Scanner(s); 
    sc.useDelimiter(","); 
    while (sc.hasNext()) { 
     System.err.println(sc.next()); 
    } 

    System.err.println("--- StringTokenizer Output ---"); 

    StringTokenizer tok = new StringTokenizer(s, ","); 
    while (tok.hasMoreTokens()) { 
     System.err.println(tok.nextToken()); 
    } 
    } 
} 

Output

$ java Main12 
--- String.split Output --- 
,abd,def,,ghi, -> [, abd, def, , ghi] 
tokens[0] = 
tokens[1] = abd 
tokens[2] = def 
tokens[3] = 
tokens[4] = ghi 
--- Scanner Output --- 
abd 
def 

ghi 
--- StringTokenizer Output --- 
abd 
def 
ghi 

Trả lời

12

Vượt qua một -1 để split như limit luận:

String s = ",abd,def,,ghi,"; 
String[] tokens = s.split(",", -1); 

Sau đó mảng kết quả của bạn sẽ bao gồm bất kỳ chuỗi rỗng nào có đuôi.

Từ javadocs:

Nếu [giới hạn] là không tích cực sau đó mô hình sẽ được áp dụng nhiều lần càng tốt và mảng có thể có bất kỳ chiều dài. Nếu [giới hạn] bằng 0 thì mẫu sẽ được áp dụng nhiều lần nhất có thể, mảng có thể có độ dài bất kỳ và các chuỗi rỗng sẽ bị loại bỏ.

Gọi split(regex) hoạt động như thể đối số limit0, vì vậy các chuỗi trống sẽ bị hủy.