Tôi chỉ thấy các giải pháp ở đây nhưng không có giải thích đầy đủ về vấn đề nên tôi quyết định đăng câu trả lời này
Vấn đề
Bạn cần biết một số điều về text.split(delim)
. split
phương pháp:
- chấp nhận dưới dạng biểu thức chính quy đối số (regex) mô tả dấu phân cách mà chúng ta muốn tách,
- nếu
delim
tồn tại ở cuối text
like in a,b,c,,
(nơi có dấu phân cách ,
) split
lúc đầu sẽ tạo mảng như thế ["a" "b" "c" "" ""]
nhưng vì trong hầu hết các trường hợp, chúng ta không thực sự cần các chuỗi trống theo sau này, nó cũng tự động loại bỏ chúng cho chúng ta. Vì vậy, nó tạo ra một mảng khác không có các chuỗi trống theo sau này và trả về nó .
Bạn cũng cần biết rằng dấu chấm.
là ký tự đặc biệt trong regex . Nó đại diện cho bất kỳ ký tự nào (ngoại trừ dấu phân cách dòng nhưng điều này có thể được thay đổi bằng Pattern.DOTALL
cờ).
Vì vậy, đối với chuỗi như "abc"
nếu chúng ta tách trên "."
split
phương thức sẽ
- tạo mảng như
["" "" "" ""]
,
- nhưng vì mảng này chỉ chứa các chuỗi trống và tất cả chúng đều ở phía sau nên chúng sẽ bị loại bỏ (như được hiển thị trong điểm thứ hai trước đó)
có nghĩa là chúng ta sẽ nhận được kết quả là mảng trống []
(không có phần tử, thậm chí không phải chuỗi rỗng), vì vậy chúng ta không thể sử dụng fn[0]
vì không có chỉ mục 0.
Giải pháp
Để giải quyết vấn đề này, bạn chỉ cần tạo regex sẽ đại diện cho dấu chấm. Để làm như vậy chúng ta cần phải thoát khỏi điều đó .
. Có một số cách để làm điều đó, nhưng đơn giản nhất có lẽ là bằng cách sử dụng \
(mà trong Chuỗi cần được viết "\\"
vì \
nó cũng đặc biệt ở đó và yêu cầu một cái khác \
phải được thoát).
Vì vậy, giải pháp cho vấn đề của bạn có thể trông giống như
String[] fn = filename.split("\\.");
Tặng kem
Bạn cũng có thể sử dụng các cách khác để thoát khỏi dấu chấm đó như
- sử dụng lớp ký tự
split("[.]")
- gói nó trong trích dẫn
split("\\Q.\\E")
- sử dụng mẫu phù hợp với
Pattern.LITERAL
cờ
- hoặc chỉ cần sử dụng
split(Pattern.quote("."))
và để regex thực hiện việc thoát cho bạn.