Tôi thích ý tưởng của StringTokenizer vì nó là Vô số.
Nhưng nó cũng đã lỗi thời và được thay thế bằng String.split trả về một chuỗi nhàm chán [] (và không bao gồm các dấu phân cách).
Vì vậy, tôi đã triển khai StringTokenizerEx là một Iterable và cần một biểu thức chính quy để phân tách một chuỗi.
Một biểu thức chính quy có nghĩa là nó không phải là một 'Chuỗi ký tự' được lặp lại để tạo thành dấu phân cách:
'o' sẽ chỉ khớp với 'o' và chia 'ooo' thành ba dấu phân cách, bên trong có hai chuỗi trống:
[o], '', [o], '', [o]
Nhưng regrec o + sẽ trả về kết quả mong đợi khi chia "aooob"
[], 'a', [ooo], 'b', []
Để sử dụng StringTokenizerEx này:
final StringTokenizerEx aStringTokenizerEx = new StringTokenizerEx("boo:and:foo", "o+");
final String firstDelimiter = aStringTokenizerEx.getDelimiter();
for(String aString: aStringTokenizerEx )
{
// uses the split String detected and memorized in 'aString'
final nextDelimiter = aStringTokenizerEx.getDelimiter();
}
Mã của lớp này có sẵn tại DZone Snippets .
Như thường lệ đối với phản hồi thử thách mã (một lớp độc lập có bao gồm các trường hợp kiểm tra), sao chép-dán nó (trong thư mục 'src / test') và chạy nó . Phương thức main () của nó minh họa các cách sử dụng khác nhau.
Lưu ý: (chỉnh sửa cuối năm 2009)
Bài viết Suy nghĩ cuối cùng: Java Puzzler: Splits Hairs thực hiện tốt công việc giải thích hành vi kỳ quái trong String.split().
Josh Bloch thậm chí còn bình luận khi trả lời bài báo đó:
Vâng, đây là một nỗi đau. FWIW, nó đã được thực hiện vì một lý do rất tốt: khả năng tương thích với Perl.
Người đã làm điều đó là Mike "madbot" McCloskey, người hiện đang làm việc với chúng tôi tại Google. Mike đảm bảo rằng các biểu thức chính quy của Java đã vượt qua hầu hết các bài kiểm tra biểu thức chính quy 30K Perl (và chạy nhanh hơn).
Guava thư viện chung của Google cũng chứa một Splitter là:
- sử dụng đơn giản hơn
- được duy trì bởi Google (chứ không phải bởi bạn)
Vì vậy, nó có thể có giá trị được kiểm tra. Từ tài liệu thô ban đầu của họ (pdf) :
JDK có điều này:
String[] pieces = "foo.bar".split("\\.");
Sử dụng cái này là tốt nếu bạn muốn chính xác những gì nó làm: - biểu thức chính quy - kết quả là một mảng - cách xử lý các phần trống của nó
Câu đố nhỏ: ", a ,, b,". Split (",") trả về ...
(a) "", "a", "", "b", ""
(b) null, "a", null, "b", null
(c) "a", null, "b"
(d) "a", "b"
(e) None of the above
Trả lời: (e) Không có điều nào ở trên.
",a,,b,".split(",")
returns
"", "a", "", "b"
Chỉ có trống rỗng được bỏ qua! (Ai biết cách giải quyết để tránh bỏ qua? Đó là một trò vui ...)
Trong mọi trường hợp, Bộ chia của chúng tôi đơn giản là linh hoạt hơn: Hành vi mặc định là đơn giản:
Splitter.on(',').split(" foo, ,bar, quux,")
--> [" foo", " ", "bar", " quux", ""]
Nếu bạn muốn các tính năng bổ sung, yêu cầu chúng!
Splitter.on(',')
.trimResults()
.omitEmptyStrings()
.split(" foo, ,bar, quux,")
--> ["foo", "bar", "quux"]
Thứ tự của các phương thức cấu hình không thành vấn đề - trong quá trình phân tách, việc cắt xén xảy ra trước khi kiểm tra trống.