2012-07-30 68 views
33

Tôi muốn biết cách tách một chuỗi lớn thành một chuỗi các chuỗi hoặc từ nhỏ hơn. Ví dụ:Tách chuỗi thành từng từ riêng lẻ Java

Tôi muốn dắt chó đi dạo.

Tôi muốn có một chuỗi: "I", chuỗi khác: "want" vv

Làm thế nào tôi sẽ làm điều này?

+2

Vui lòng hiển thị * những gì bạn đã thử (ví dụ: bạn có tìm từ "tách" trong tài liệu cho chuỗi không?) –

+9

Có, Chuỗi # split() được đặt tên rất mơ hồ :-P – maksimov

Trả lời

56

Sử dụng split() phương pháp

Ví dụ:

String s = "I want to walk my dog"; 

String[] arr = s.split(" ");  

for (String ss : arr) { 

     System.out.println(ss); 
    } 
+0

Chuỗi đã được xác định? – fosho

+0

@fosho cảm ơn ... đó là lỗi đánh máy –

+13

Phương pháp này sẽ không xóa dấu phẩy, dấu chấm, v.v. khỏi các từ. – kazy

1

Sử dụng split()

String words[] = stringInstance.split(" "); 
+0

tôi nhập khẩu? – fosho

+2

không có gì

+1

Vui lòng xem qua liên kết từ câu trả lời –

2

Bạn có thể sử dụng split(" ") phương pháp của lớp String và có thể nhận được mỗi từ như mã đưa ra dưới đây:

String s = "I want to walk my dog"; 
String []strArray=s.split(" "); 
for(int i=0; i<strArray.length;i++) { 
    System.out.println(strArray[i]); 
} 
2

Tuy nhiên, một phương pháp khác, sử dụng StringTokenizer:

String s = "I want to walk my dog"; 
StringTokenizer tokenizer = new StringTokenizer(s); 

while(tokenizer.hasMoreTokens()) { 
    System.out.println(tokenizer.nextToken()); 
} 
+0

ah! điều này là tốt trong trường hợp tôi không cần một mảng nhưng không phải là tokenizer trở về một mảng của mã thông báo? ý tưởng hay mặc dù –

+0

Không, không có mảng nào được tạo ra. 'StringTokenizer' tìm kiếm các mã thông báo liên tiếp trong chuỗi và trả về từng cái một. – Kao

+0

Giải pháp tốt, thật không may, StringTokenizer không nên được sử dụng nữa. Từ Tài liệu: StringTokenizer là lớp cũ được giữ lại vì lý do tương thích mặc dù việc sử dụng nó không được khuyến khích trong mã mới. Đó là khuyến cáo rằng bất cứ ai tìm kiếm chức năng này sử dụng phương pháp chia String hoặc gói java.util.regex thay thế. – Tomor

19

Một regex cũng có thể được sử dụng để chia lời. \ W có thể được sử dụng để phù hợp với nhân vật từ ([A-Za-Z0-9_]), do đó chấm câu đó được lấy ra từ các kết quả:

String s = "I want to walk my dog, and why not?"; 
Pattern pattern = Pattern.compile("\\w+"); 
Matcher matcher = pattern.matcher(s); 
while (matcher.find()) { 
    System.out.println(matcher.group()); 
} 

Đầu ra:

I 
want 
to 
walk 
my 
dog 
and 
why 
not 

Xem Java tài liệu API cho Pattern

+0

Điều này có tạo ra các từ trống không? –

35

là một giải pháp tổng quát hơn (! nhưng ASCII chỉ), bao gồm bất kỳ dải phân cách khác giữa các từ (như dấu phẩy và dấu chấm phẩy), tôi đề nghị:

String s = "I want to walk my dog, cat, and tarantula; maybe even my tortoise."; 
String[] words = s.split("\\W+"); 

Regex có nghĩa là dấu phân tách sẽ là bất kỳ thứ gì không phải là một từ [\ W], theo nhóm ít nhất một [+]. Bởi vì [+] tham lam, nó sẽ lấy ví dụ ';' và '' với nhau như một dấu phân tách.

+4

\\ W dường như chỉ xem xét các ký tự chữ cái ASCII. Nó không thích hợp cho các ngôn ngữ có dấu trọng âm. – rghome

+0

Cảm ơn bạn đã chỉ ra điều đó! Thay đổi câu trả lời cho phù hợp. –

3

Xem other answer ký tự nếu cụm từ của bạn chứa nhấn mạnh của tôi:

String[] listeMots = phrase.split("\\P{L}+"); 
+1

Đây là câu trả lời hay nhất. – rghome

0

Để bao gồm bất kỳ dải phân cách giữa các từ (như tất cả mọi thứ trừ tất cả chữ thường và chữ cái viết hoa), chúng tôi có thể làm:

String mystring = "hi, there,hi Leo"; 
String[] arr = mystring.split("[^a-zA-Z]+"); 
for(int i = 0; i < arr.length; i += 1) 
{ 
    System.out.println(arr[i]); 
} 

Ở đây, regex có nghĩa là các dấu tách sẽ là bất kỳ thứ gì không phải là chữ thường hoặc chữ thường [^a-zA-Z], theo nhóm ít nhất một [+].

Các vấn đề liên quan