2011-11-16 37 views
8

Đây là bản theo dõi this question.Hành vi phân chia chuỗi trên chuỗi trống và trên chuỗi phân cách đơn lẻ

Câu hỏi đặt ở dòng thứ hai bên dưới.

"".split("x"); //returns {""} // ok 
"x".split("x"); //returns {} but shouldn't it return {""} because it's the string before "x" ? 
"xa".split("x"); //returns {"", "a"} // see?, here "" is the first string returned 
"ax".split("x"); //returns {"a"} 
+1

xem [SI-5096] (https://issues.scala-lang.org/browse/SI-5069) "Bug trong split() khi delimiters xảy ra ở cuối chuỗi" – 4e6

+1

Đây là lý do tại sao Google Ổi đã tạo com.google.common.base.Splitter – Schildmeijer

Trả lời

5

Theo java.util.regex.Patternsource, mà String.split(..) sử dụng,

"".split("x"); // returns {""} - valid - when no match is found, return the original string 
"x".split("x"); // returns {} - valid - trailing empty strings are removed from the resultant array {"", ""} 
"xa".split("x"); // returns {"", "a"} - valid - only trailing empty strings are removed 
"ax".split("x"); // returns {"a"} - valid - trailing empty strings are removed from the resultant array {"a", ""} 
+2

để nó hoạt động chính xác vì phương thức mà nó gọi ... hoạt động theo cách đó? Tôi tự hỏi những gì ông chủ của tôi sẽ nói khi tôi đóng báo cáo lỗi tiếp theo với một đối số như thế. –

+0

@Kim Stebel, không phải 'SO' là một trình gỡ lỗi, tôi cũng không phải sửa lỗi cho nó. Bài này về cơ bản yêu cầu làm rõ, và không phải là một giải pháp, và tôi chỉ đơn giản là cố gắng trình bày lý do tại sao phương thức 'split' hoạt động theo cách đó. mang nó dễ dàng. – srkavin

7

Không, vì theo the relevant javadoc "chuỗi rỗng sẽ bị hủy".

+0

Vậy tại sao nó không bị loại bỏ trong dòng đầu tiên? (Splitting on empty String) – snappy

+0

Điều này nên được hiểu là "chuỗi rỗng ở cuối mảng kết quả sẽ bị loại bỏ". – madth3

+0

Tôi đoán nó thấy chuỗi rỗng là mã thông báo đầu tiên, sau đó chia tách sau nó, vì vậy về mặt kỹ thuật nó là một chuỗi rỗng hàng đầu –

0

Để bao gồm các chuỗi rỗng trailing, sử dụng thực hiện khác của split.

"".split("x", -1); // returns {""} - valid - when no match is found, return the original string 
"x".split("x", -1); // returns {"", ""} - valid - trailing empty strings are included in the resultant array {"", ""} 
"xa".split("x", -1); // returns {"", "a"} - valid 
"ax".split("x", -1); // returns {"a", ""} - valid - trailing empty strings are included in the resultant array {"a", ""} 
Các vấn đề liên quan