แยกสตริงออกเป็นอาร์เรย์ของสตริงอักขระ


114

ฉันต้องการแยกสตริงออกเป็นอาร์เรย์ของสตริงอักขระเดี่ยว

เช่นการแยก "cat" จะทำให้อาร์เรย์ "c", "a", "t"



3
เพื่อเป็นข้อมูลอ้างอิงอย่างรวดเร็ว "" .join (["c", "a", "t"]) เพื่อรับ "cat" กลับมา
shuva

2
อาจซ้ำกันของการแยกคำเป็นตัวอักษรใน Java

Java 8: .split("")จะทำ
Amr Lotfy

คำตอบ:


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

นี้จะผลิต

อาร์เรย์ ["c", "a", "t"]


8
อย่างไรและทำไม? นิพจน์นี้หมายถึงอักขระใด ๆ หรือไม่? เนื่องจากในใจของฉันด้วยวิธีการแยกทำงานสิ่งนี้ควรแยกเฉพาะอักขระจริง (,?,!, ^ และ) อย่างไรก็ตามมันได้ผลตามที่คุณพูด
Ty_

3
นี่คือนิพจน์นิพจน์ทั่วไปที่เรียกว่าผู้มองเชิงลบ ตรวจสอบเอกสารที่นี่: docs.oracle.com/javase/6/docs/api/java/util/regex/…
เออร์วิน

4
@ EW-CodeMonkey (?!... )เป็นไวยากรณ์ regex สำหรับการยืนยันเชิงลบ - ยืนยันว่าไม่มีสิ่งที่อยู่ข้างในตรงกัน และ^ตรงกับจุดเริ่มต้นของสตริงดังนั้น regex จึงจับคู่กับทุกตำแหน่งที่ไม่ใช่จุดเริ่มต้นของสตริงและแทรกการแบ่งที่นั่น regex นี้จะจับคู่ที่ส่วนท้ายของสตริงด้วยและจะต่อท้ายสตริงว่างในผลลัพธ์ด้วยยกเว้นในString.splitเอกสารระบุว่า "สตริงว่างต่อท้ายไม่รวมอยู่ในอาร์เรย์ผลลัพธ์"
Boann

8
ใน Java 8 พฤติกรรมของString.splitมีการเปลี่ยนแปลงเล็กน้อยเพื่อให้สตริงว่างชั้นนำที่สร้างโดยการจับคู่ความกว้างเป็นศูนย์ไม่รวมอยู่ในอาร์เรย์ผลลัพธ์ดังนั้นการ(?!^)ยืนยันว่าตำแหน่งไม่ใช่จุดเริ่มต้นของสตริงจึงไม่จำเป็นทำให้ regex สามารถ ทำให้ง่ายขึ้นจนไม่มีอะไรเลย - "cat".split("")- แต่ใน Java 7 และต่ำกว่านั้นจะสร้างสตริงว่างชั้นนำในอาร์เรย์ผลลัพธ์
Boann

1
สร้างอาร์เรย์ของสตริงทั้งหมด
Eduard

109
"cat".toCharArray()

แต่ถ้าคุณต้องการสตริง

"cat".split("")

แก้ไข: ซึ่งจะส่งคืนค่าแรกที่ว่างเปล่า


12
"cat" .split ("") จะคืนค่า [, c, a, t] ไม่? คุณจะมีตัวละครพิเศษใน Array ของคุณ ...
แนวปะการัง

4
"cat" .split ("") ไม่ทำงานตามที่ Matt คาดไว้คุณจะได้รับ String ว่างเปล่าพิเศษ => [, c, a, t]
แนวปะการัง

5
คำตอบนี้ใช้ได้ผลหากคุณใช้ Java 8 ดูstackoverflow.com/a/22718904/1587046
Alexis C.

4
นี่เป็นการเปลี่ยนแปลงที่น่าสยดสยองใน jdk8 เพราะฉันอาศัยการแยก ("") และหาวิธีแก้ปัญหาสาเหตุของดัชนีแรกว่างเปล่าโง่ ๆ นี้ หลังจากอัปเกรดเป็น java8 แล้วมันก็ใช้งานได้ตามที่ฉันคาดหวังไว้เมื่อหลายปีก่อน น่าเสียดายที่ตอนนี้วิธีแก้ปัญหาของฉันทำลายรหัสของฉัน ... ggrrrr
Marc

@ มาร์คคุณน่าจะใช้.toCharArray()ต่อไป; มันหลีกเลี่ยง regex และส่งคืนอาร์เรย์ของcharprimitives เพื่อให้เร็วขึ้นและเบาลง มันเป็นเรื่องแปลกที่ต้องอาร์เรย์ของ 1 ตัวสตริง
Boann

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

3
Nitpicking คำถามเดิมถามอาร์เรย์ของ String ไม่ใช่อาร์เรย์ของ Char อย่างไรก็ตามมันค่อนข้างง่ายที่จะรับอาร์เรย์ของ String จากที่นี่
dsolimano

ใช่ฉันรู้วิธีรับอาร์เรย์ของตัวอักษรแล้ว ฉันสามารถทำซ้ำผ่านอาร์เรย์ char และสร้างสตริงจากแต่ละอันได้หากไม่มีวิธีอื่น
Matt

คุณจะแปลงcArrayกลับเป็นStringอย่างไร
Bitmap

ไวยากรณ์ที่ถูกต้องจะเป็น: char [] cArray = str ToCharArray ();
dbz

6

หากตัวอักษรเกินสื่อสารได้หลายภาษาเครื่องบินพื้นฐานคาดว่าจะมีการป้อนข้อมูล (บางตัวอักษร CJK อีโมจิใหม่ ... ), วิธีการเช่น"a💫b".split("(?!^)")นี้ไม่สามารถใช้เพราะพวกเขาทำลายตัวอักษรเช่น (ผลเข้าarray ["a", "?", "?", "b"]) และบางสิ่งบางอย่างที่ปลอดภัยจะต้องมีการใช้

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

2

วิธีที่มีประสิทธิภาพในการเปลี่ยน String เป็นอาร์เรย์ของสตริงอักขระเดียวคือการทำสิ่งนี้:

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

อย่างไรก็ตามสิ่งนี้ไม่ได้คำนึงถึงความจริงที่ว่าcharใน a Stringอาจแสดงถึงครึ่งหนึ่งของ Unicode code-point (ถ้าจุดรหัสไม่ได้อยู่ใน BMP) เพื่อจัดการกับสิ่งนั้นคุณต้องวนซ้ำผ่านจุดรหัส ... ซึ่งซับซ้อนกว่า

วิธีนี้จะเร็วกว่าการใช้String.split(/* clever regex*/)และอาจเร็วกว่าการใช้สตรีม Java 8+ น่าจะเร็วกว่านี้:

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

เนื่องจากtoCharArrayต้องคัดลอกอักขระไปยังอาร์เรย์ใหม่


2

เพื่อสรุปคำตอบอื่น ๆ ...

สิ่งนี้ใช้ได้กับ Java ทุกเวอร์ชัน:

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

สิ่งนี้ใช้ได้กับ Java 8 ขึ้นไปเท่านั้น:

"cat".split("")

0

บางทีคุณอาจใช้ for loop ที่ผ่านเนื้อหา String และแยกอักขระตามอักขระโดยใช้charAtเมธอด

เมื่อรวมกับArrayList<String>ตัวอย่างคุณจะได้รับอาร์เรย์ของอักขระแต่ละตัว


บางทีคุณอาจยืนขาเดียวแล้วร้องเพลง "God Save the Queen" ขออภัย แต่ยังไม่ใกล้เคียงกับการแก้ไข
Stephen C

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

1
คุณแน่ใจหรือว่าสิ่งนี้จะแบ่งสตริงออกเป็นอาร์เรย์ คุณกำลังพิมพ์สตริงบนหน้าจอ
TDG

0

หากสตริงเดิมมีอักขระ Unicode เสริมก็split()จะใช้ไม่ได้เนื่องจากจะแยกอักขระเหล่านี้ออกเป็นคู่ตัวแทน ในการจัดการอักขระพิเศษเหล่านี้อย่างถูกต้องรหัสเช่นนี้ใช้งานได้:

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("(?!^)")ทำงานไม่ถูกต้องหากสตริงมีคู่ตัวแทน คุณควรใช้split("(?<=.)").

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

เอาท์พุท:

[花, a, b, 🌹, 🌺, 🌷]

0

ตัวดำเนินการกระจาย [ ...] สร้างอาร์เรย์โดยมีอักขระแต่ละตัวในสตริง:

const cat= 'cat';
const arrayized = [...cat] // ['c', 'a', 't'];

console.log(arrayized);

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.