ฉันต้องการแยกสตริงออกเป็นอาร์เรย์ของสตริงอักขระเดี่ยว
เช่นการแยก "cat" จะทำให้อาร์เรย์ "c", "a", "t"
.split("")
จะทำ
ฉันต้องการแยกสตริงออกเป็นอาร์เรย์ของสตริงอักขระเดี่ยว
เช่นการแยก "cat" จะทำให้อาร์เรย์ "c", "a", "t"
.split("")
จะทำ
คำตอบ:
"cat".split("(?!^)")
นี้จะผลิต
อาร์เรย์ ["c", "a", "t"]
(?!
... )
เป็นไวยากรณ์ regex สำหรับการยืนยันเชิงลบ - ยืนยันว่าไม่มีสิ่งที่อยู่ข้างในตรงกัน และ^
ตรงกับจุดเริ่มต้นของสตริงดังนั้น regex จึงจับคู่กับทุกตำแหน่งที่ไม่ใช่จุดเริ่มต้นของสตริงและแทรกการแบ่งที่นั่น regex นี้จะจับคู่ที่ส่วนท้ายของสตริงด้วยและจะต่อท้ายสตริงว่างในผลลัพธ์ด้วยยกเว้นในString.split
เอกสารระบุว่า "สตริงว่างต่อท้ายไม่รวมอยู่ในอาร์เรย์ผลลัพธ์"
String.split
มีการเปลี่ยนแปลงเล็กน้อยเพื่อให้สตริงว่างชั้นนำที่สร้างโดยการจับคู่ความกว้างเป็นศูนย์ไม่รวมอยู่ในอาร์เรย์ผลลัพธ์ดังนั้นการ(?!^)
ยืนยันว่าตำแหน่งไม่ใช่จุดเริ่มต้นของสตริงจึงไม่จำเป็นทำให้ regex สามารถ ทำให้ง่ายขึ้นจนไม่มีอะไรเลย - "cat".split("")
- แต่ใน Java 7 และต่ำกว่านั้นจะสร้างสตริงว่างชั้นนำในอาร์เรย์ผลลัพธ์
"cat".toCharArray()
แต่ถ้าคุณต้องการสตริง
"cat".split("")
แก้ไข: ซึ่งจะส่งคืนค่าแรกที่ว่างเปล่า
.toCharArray()
ต่อไป; มันหลีกเลี่ยง regex และส่งคืนอาร์เรย์ของchar
primitives เพื่อให้เร็วขึ้นและเบาลง มันเป็นเรื่องแปลกที่ต้องอาร์เรย์ของ 1 ตัวสตริง
String str = "cat";
char[] cArray = str.toCharArray();
cArray
กลับเป็นString
อย่างไร
หากตัวอักษรเกินสื่อสารได้หลายภาษาเครื่องบินพื้นฐานคาดว่าจะมีการป้อนข้อมูล (บางตัวอักษร CJK อีโมจิใหม่ ... ), วิธีการเช่น"a💫b".split("(?!^)")
นี้ไม่สามารถใช้เพราะพวกเขาทำลายตัวอักษรเช่น (ผลเข้าarray ["a", "?", "?", "b"]
) และบางสิ่งบางอย่างที่ปลอดภัยจะต้องมีการใช้
"a💫b".codePoints()
.mapToObj(cp -> new String(Character.toChars(cp)))
.toArray(size -> new String[size]);
วิธีที่มีประสิทธิภาพในการเปลี่ยน 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
ต้องคัดลอกอักขระไปยังอาร์เรย์ใหม่
เพื่อสรุปคำตอบอื่น ๆ ...
สิ่งนี้ใช้ได้กับ Java ทุกเวอร์ชัน:
"cat".split("(?!^)")
สิ่งนี้ใช้ได้กับ Java 8 ขึ้นไปเท่านั้น:
"cat".split("")
บางทีคุณอาจใช้ for loop ที่ผ่านเนื้อหา String และแยกอักขระตามอักขระโดยใช้charAt
เมธอด
เมื่อรวมกับArrayList<String>
ตัวอย่างคุณจะได้รับอาร์เรย์ของอักขระแต่ละตัว
for(int i=0;i<str.length();i++)
{
System.out.println(str.charAt(i));
}
หากสตริงเดิมมีอักขระ 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);
}
split("(?!^)")
ทำงานไม่ถูกต้องหากสตริงมีคู่ตัวแทน คุณควรใช้split("(?<=.)")
.
String[] splitted = "花ab🌹🌺🌷".split("(?<=.)");
System.out.println(Arrays.toString(splitted));
เอาท์พุท:
[花, a, b, 🌹, 🌺, 🌷]
ตัวดำเนินการกระจาย [ ...
] สร้างอาร์เรย์โดยมีอักขระแต่ละตัวในสตริง:
const cat= 'cat';
const arrayized = [...cat] // ['c', 'a', 't'];
console.log(arrayized);