Chia chuỗi thành mảng chuỗi ký tự


Câu trả lời:


120
"cat".split("(?!^)")

Điều này sẽ tạo ra

mảng ["c", "a", "t"]


8
Như thế nào và tại sao? Đây có phải là một regex có nghĩa là bất kỳ ký tự nào không? Bởi vì theo suy nghĩ của tôi, với cách phân chia hoạt động, điều này sẽ chỉ phân chia trên các ký tự thực (,?,!, ^, Và). Tuy nhiên, nó hoạt động như bạn nói.
Ty_ Ngày

3
Đây thực sự là một biểu thức regex, được gọi là một cái nhìn tiêu cực. Kiểm tra tài liệu tại đây: docs.oracle.com/javase/6/docs/api/java/util/regex/…
Erwin

4
@ EW-CodeMonkey (?!... )là cú pháp regex cho một khẳng định phủ định - nó khẳng định rằng không có sự khớp với những gì bên trong nó. Và ^khớp với phần đầu của chuỗi, do đó, regex khớp ở mọi vị trí không phải là phần đầu của chuỗi và chèn một phần tách ở đó. Regex này cũng khớp ở cuối chuỗi và do đó cũng sẽ nối một chuỗi trống vào kết quả, ngoại trừ String.splittài liệu cho biết "các chuỗi trống theo sau không được bao gồm trong mảng kết quả".
Boann

8
Trong Java 8, hành vi của String.splitđã được thay đổi một chút để các chuỗi trống dẫn đầu được tạo ra bởi một kết quả có độ rộng bằng 0 cũng không được bao gồm trong mảng kết quả, do đó, việc (?!^)khẳng định rằng vị trí không phải là đầu của chuỗi trở nên không cần thiết, cho phép regex được đơn giản hóa thành không có gì - "cat".split("")- nhưng trong Java 7 trở xuống tạo ra một chuỗi trống ở đầu trong mảng kết quả.
Boann

1
Nó tạo ra một mảng của toàn bộ một chuỗi.
Eduard

109
"cat".toCharArray()

Nhưng nếu bạn cần chuỗi

"cat".split("")

Chỉnh sửa: sẽ trả về giá trị đầu tiên trống.


12
"cat" .split ("") sẽ trả về [, c, a, t], không? Bạn sẽ có thêm một nhân vật trong Mảng của mình ...
san hô

4
"Cat" .split ("") không hoạt động như mong đợi của Matt, bạn sẽ nhận được thêm một String rỗng => [, c, a, t].
rạn san hô

5
Câu trả lời này hiện hoạt động nếu bạn đang sử dụng Java 8. Xem stackoverflow.com/a/22718904/1587046
Alexis C.

4
Đây là một thay đổi khủng khiếp trong jdk8 vì tôi dựa vào phân tách ("") và đã giải quyết nguyên nhân của chỉ mục đầu tiên trống ngớ ngẩn này. Bây giờ sau khi nâng cấp lên java8, nó hoạt động như tôi đã mong đợi từ nhiều năm trước. rất tiếc bây giờ giải pháp thay thế của tôi làm hỏng mã của tôi ... ggrrrr.
Marc

@Marc .toCharArray()Dù sao thì bạn cũng nên sử dụng ; nó tránh regex và trả về một mảng charnguyên thủy để nó nhanh hơn và nhẹ hơn. Thật kỳ lạ khi cần một mảng chuỗi 1 ký tự .
Boann

41
String str = "cat";
char[] cArray = str.toCharArray();

3
Nitpicking, câu hỏi ban đầu yêu cầu một mảng Chuỗi, không phải mảng Char. Tuy nhiên, khá dễ dàng để lấy một mảng Chuỗi từ đây.
dsolimano

Vâng, tôi đã biết cách lấy một dãy ký tự. Mặc dù vậy, tôi chỉ có thể lặp qua mảng char và tạo một chuỗi từ mỗi mảng, nếu không có cách nào khác.
Matt

Làm thế nào bạn sẽ chuyển đổi cArraytrở lại String?
Bitmap

Cú pháp đúng sẽ là: char [] cArray = str.ToCharArray ();
dbz

6

Nếu các ký tự ngoài Mặt phẳng đa ngôn ngữ cơ bản được mong đợi khi nhập (một số ký tự CJK, biểu tượng cảm xúc mới ...), thì "a💫b".split("(?!^)")không thể sử dụng các phương pháp như vậy , vì chúng ngắt các ký tự như vậy (kết quả thành array ["a", "?", "?", "b"]) và phải sử dụng thứ gì đó an toàn hơn:

"a💫b".codePoints()
    .mapToObj(cp -> new String(Character.toChars(cp)))
    .toArray(size -> new String[size]);

2

Một cách hiệu quả để biến một Chuỗi thành một mảng các Chuỗi một ký tự là thực hiện điều này:

String[] res = new String[str.length()];
for (int i = 0; i < str.length(); i++) {
    res[i] = Character.toString(str.charAt(i));
}

Tuy nhiên, điều này không tính đến thực tế là một chartrong một Stringthực sự có thể đại diện cho một nửa điểm mã Unicode. (Nếu điểm mã không có trong BMP.) Để giải quyết điều đó, bạn cần phải lặp lại các điểm mã ... điều này phức tạp hơn.

Cách tiếp cận này sẽ nhanh hơn so với sử dụng String.split(/* clever regex*/)và có thể sẽ nhanh hơn so với sử dụng các luồng Java 8+. Nó có thể nhanh hơn thế này:

String[] res = new String[str.length()];
int 0 = 0;
for (char ch: str.toCharArray[]) {
    res[i++] = Character.toString(ch);
}  

bởi vì toCharArrayphải sao chép các ký tự vào một mảng mới.


2

Để tổng hợp các câu trả lời khác ...

Điều này hoạt động trên tất cả các phiên bản Java:

"cat".split("(?!^)")

Điều này chỉ hoạt động trên Java 8 trở lên:

"cat".split("")

0

Có thể bạn có thể sử dụng một vòng lặp for đi qua nội dung Chuỗi và trích xuất các ký tự theo các ký tự bằng charAtphương pháp này.

Kết hợp với một ArrayList<String>ví dụ, bạn có thể nhận được mảng các ký tự riêng lẻ của mình.


Có lẽ bạn có thể đứng bằng một chân và hát "God Save the Queen". Xin lỗi, nhưng điều này thậm chí không chính xác.
Stephen C

0
for(int i=0;i<str.length();i++)
{
System.out.println(str.charAt(i));
}

1
Bạn có chắc chắn rằng điều này sẽ chia một chuỗi thành một mảng không? Bạn chỉ cần in chuỗi ra màn hình.
TDG

0

Nếu chuỗi ban đầu chứa các ký tự Unicode bổ sung thì split()sẽ không hoạt động vì nó chia các ký tự này thành các cặp thay thế. Để xử lý chính xác các ký tự đặc biệt này, một mã như thế này hoạt động:

String[] chars = new String[stringToSplit.codePointCount(0, stringToSplit.length())];
for (int i = 0, j = 0; i < stringToSplit.length(); j++) {
    int cp = stringToSplit.codePointAt(i);
    char c[] = Character.toChars(cp);
    chars[j] = new String(c);
    i += Character.charCount(cp);
}

0

split("(?!^)")không hoạt động chính xác nếu chuỗi chứa các cặp thay thế. Bạn nên sử dụng split("(?<=.)").

String[] splitted = "花ab🌹🌺🌷".split("(?<=.)");
System.out.println(Arrays.toString(splitted));

đầu ra:

[花, a, b, 🌹, 🌺, 🌷]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.