Java เมธอด split() ของสตริง พร้อมตัวอย่าง
⚡ สรุปอย่างชาญฉลาด
แยกสตริงเข้า Java โดยใช้เมธอด split() ซึ่งจะแบ่งข้อความทุกครั้งที่พบตัวคั่น และส่งคืนส่วนต่างๆ ในรูปแบบอาร์เรย์สตริง มีอาร์กิวเมนต์ limit ที่เป็นตัวเลือกเพื่อจำกัดจำนวนส่วนที่จะแบ่ง โดยส่วนที่เหลือจะยังคงอยู่เหมือนเดิม
สตริง split() คืออะไร Java?
การขอ split() วิธีการนี้ช่วยให้คุณสามารถทำลายได้ เชือก โดยอิงจากสิ่งที่เฉพาะเจาะจง Java ตัวคั่นสตริง โดยส่วนใหญ่ตัวคั่นจะเป็นช่องว่างหรือเครื่องหมายจุลภาค (,) ที่คุณต้องการใช้แบ่งสตริง
แยก () ไวยากรณ์ของฟังก์ชัน
public String[] split(String regex) public String[] split(String regex, int limit)
⚠️ หมายเหตุเกี่ยวกับประเภทการส่งคืน: split() ส่งคืน a String[] แถว, ไม่มีแม้แต่คนเดียว Stringการกำหนดผลลัพธ์ให้กับตัวแปรธรรมดา String ตัวแปรดังกล่าวไม่สามารถคอมไพล์ได้เนื่องจากข้อผิดพลาดประเภทไม่เข้ากัน ซึ่งเป็นข้อผิดพลาดที่พบบ่อยที่สุดสำหรับผู้เริ่มต้นใช้วิธีนี้
พารามิเตอร์
- เรเก็กซ์: นิพจน์ปกติที่ใช้กับข้อความหรือสตริง
- จำกัด : จำนวนค่าสูงสุดในอาร์เรย์ผลลัพธ์ หากละเว้นหรือเป็นศูนย์ ระบบจะส่งคืนสตริงย่อยทั้งหมดที่ตรงกับนิพจน์ปกติ
วิธีแยกสตริงเข้า Java ด้วยตัวคั่น
ตัวอย่างด้านล่างแสดงวิธีการแยกสตริงใน Java โดยใช้ตัวคั่น
สมมติว่าเรามีตัวแปรสตริงชื่อ strMain ประกอบด้วยคำไม่กี่คำ ได้แก่ อัลฟา เบตา แกมมา Delta, ซิกมา — คั่นด้วยเครื่องหมายจุลภาค (,)
ในที่นี้หากเราต้องการสตริงเดี่ยวๆ ทั้งหมด รูปแบบที่ดีที่สุดที่เป็นไปได้คือการแยกมันตามเครื่องหมายจุลภาค ดังนั้นเราจะได้ 5 สายแยกกันดังนี้:
- แอลฟา
- เบต้า
- พิสัย
- Delta
- ซิกม่า
ใช้สตริง แยก วิธีการใน Java ใช้ตัวคั่นเพื่อแยกสตริงที่ต้องการแบ่ง โดยระบุตัวคั่นเป็นอาร์กิวเมนต์
ในการนี้ Java แยกสตริงด้วยตัวคั่น ตัวคั่นคือลูกน้ำ (,) และผลลัพธ์ของ Java การแบ่งสตริงด้วยการใช้เครื่องหมายจุลภาคจะทำให้คุณได้การแบ่งอาร์เรย์
class StrSplit{
public static void main(String []args){
String strMain = "Alpha, Beta, Delta, Gamma, Sigma";
String[] arrSplit = strMain.split(", ");
for (int i=0; i < arrSplit.length; i++)
{
System.out.println(arrSplit[i]);
}
}
}
การวนซ้ำในโค้ดจะพิมพ์แต่ละรายการ Java แยกสตริงออกจากอาร์เรย์หลังจากฟังก์ชันแยกใน Javaดังแสดงด้านล่าง
ผลลัพธ์ที่คาดหวัง:
Alpha Beta Delta Gamma Sigma
ตัวอย่าง: Java วิธีการแยกสตริง () พร้อม regex และความยาว
ลองพิจารณาสถานการณ์ที่คุณต้องการเพียงองค์ประกอบ 'n' แรกหลังจากใช้ฟังก์ชันแยกใน Javaแต่ต้องการให้ส่วนที่เหลือของสตริงคงเดิม ผลลัพธ์ที่ได้ควรมีลักษณะดังนี้:
- แอลฟา
- เบต้า
- Delta,แกมมา,ซิกมา
สามารถทำได้โดยการส่งอาร์กิวเมนต์อีกตัวไปพร้อมกับการดำเนินการ split() ใน Javaและนั่นจะเป็นจำนวนสตริงสูงสุดที่ต้องการ
พิจารณาโค้ดต่อไปนี้ของเมธอด split ใน Java:
class StrSplit2{
public static void main(String []args){
String strMain = "Alpha, Beta, Delta, Gamma, Sigma";
String[] arrSplit_2 = strMain.split(", ", 3);
for (int i=0; i < arrSplit_2.length; i++){
System.out.println(arrSplit_2[i]);
}
}
}
ผลลัพธ์ที่คาดหวัง:
Alpha Beta Delta, Gamma, Sigma
โปรดทราบว่าค่าจำกัดที่ 3 จะสร้างองค์ประกอบขึ้นมาสามรายการพอดี โดยตัวคั่นสองตัวแรกจะถูกนำมาใช้ และทุกอย่างที่อยู่หลังตัวคั่นตัวที่สองจะถูกเก็บไว้ด้วยกันเป็นองค์ประกอบที่สาม
วิธีแยกสตริงเข้า Java โดยอวกาศ
ลองพิจารณาสถานการณ์ที่คุณต้องการแยกสตริงด้วยช่องว่าง นี่คือสตริงที่ถูกแยกแล้ว Java ตัวแปร ชื่อ strMain ประกอบด้วยคำเพียงไม่กี่คำ: ยินดีต้อนรับเข้าสู่ Guru99.
public class StrSplit3{
public static void main(String args[]){
String strMain = "Welcome to Guru99";
String[] arrSplit_3 = strMain.split("\\s");
for (int i=0; i < arrSplit_3.length; i++){
System.out.println(arrSplit_3[i]);
}
}
}
ผลลัพธ์ที่คาดหวัง:
Welcome to Guru99
รูปแบบ \\s ตรงกับอักขระเว้นวรรคเดี่ยว ใช้ \\s+ แต่หากคำต่างๆ สามารถเว้นวรรคได้มากกว่าหนึ่งช่อง มิฉะนั้นช่องว่างแต่ละช่องที่เพิ่มเข้ามาจะทำให้เกิดองค์ประกอบว่างเปล่า
วิธีการคงสตริงว่างไว้เมื่อทำการแยกสตริง Java
พฤติกรรมอย่างหนึ่งของ split() สร้างความประหลาดใจให้กับเกือบทุกคนเมื่อได้พบเห็นเป็นครั้งแรก: สายเปล่าที่ลากยาวถูกโยนทิ้งไปอย่างเงียบๆ การแยกสาย "a,b,," เมื่อใส่เครื่องหมายจุลภาค จะได้ผลลัพธ์เป็นสององค์ประกอบ ไม่ใช่สี่องค์ประกอบ เพราะค่าเริ่มต้นที่เท่ากับศูนย์จะตัดช่องว่างทั้งหมดที่อยู่ท้ายอาร์เรย์ทิ้งไป
เรื่องนี้สำคัญมากเมื่อข้อมูลเป็นแบบระบุตำแหน่ง เช่น แถวในไฟล์ CSV ที่ค่าที่หายไปในตอนท้ายยังคง occupying คอลัมน์นั้นอยู่ การลบค่าว่างเหล่านั้นจะส่งผลต่อดัชนีทั้งหมดที่อยู่ถัดไป
ผ่านก เชิงลบ ข้อจำกัดช่วยรักษาสิ่งเหล่านั้นไว้:
String row = "Alpha,Beta,,"; // Default: trailing empty fields removed -> length 2 String[] a = row.split(","); System.out.println(a.length); // prints 2 // Negative limit: every field preserved -> length 4 String[] b = row.split(",", -1); System.out.println(b.length); // prints 4
มีกฎสามข้อที่ครอบคลุมทุกกรณี ข้อจำกัดของ เป็นศูนย์ซึ่งเป็นค่าเริ่มต้น จะใช้รูปแบบซ้ำกันให้มากที่สุดเท่าที่จะเป็นไปได้ แล้วจึงตัดสตริงว่างที่อยู่ท้ายออก บวก ฟังก์ชัน limit ใช้รูปแบบไม่เกิน limit ลบหนึ่งครั้ง ดังนั้นองค์ประกอบสุดท้ายจึงเก็บเศษที่เหลือไว้โดยไม่เปลี่ยนแปลง เหมือนกับตัวอย่างก่อนหน้านี้ที่มี limit เท่ากับ 3 A เชิงลบ คำสั่ง limit จะใช้รูปแบบดังกล่าวซ้ำให้มากที่สุดเท่าที่จะเป็นไปได้ และจะคงช่องว่างทุกช่องไว้ รวมถึงช่องที่อยู่ท้ายสุดด้วย
สตริงว่างนำหน้ามีพฤติกรรมที่แตกต่างออกไปอีก: การแยก ",a,b" ผลลัพธ์ที่ได้จะมีองค์ประกอบแรกว่างเปล่าเสมอ ไม่ว่าขีดจำกัดจะเป็นเท่าใดก็ตาม เนื่องจากรูปแบบจะตรงกันที่ตำแหน่งศูนย์ ป้องกันปัญหานี้ได้โดยการตัดแต่งข้อมูลนำเข้า หรือโดยการกรองผลลัพธ์ แถว ก่อนใช้
split() เทียบกับ StringTokenizer เทียบกับ Pattern.split(): ควรใช้ตัวไหนดี
Java ฟังก์ชันนี้มีสามวิธีในการแบ่งสตริงออกเป็นส่วนๆ ซึ่งแตกต่างกันในชนิดของตัวคั่นที่แต่ละวิธีรับ ในค่าที่ส่งคืน และในว่ารูปแบบจะถูกคอมไพล์เพียงครั้งเดียวหรือคอมไพล์ใหม่ทุกครั้งที่เรียกใช้ ซึ่งมีความสำคัญเมื่อการแบ่งเกิดขึ้นภายในลูป
| แง่มุม | สตริง.แยก() | StringTokenizer | แพทเทิร์น.แยก() |
|---|---|---|---|
| คั่น | นิพจน์ทั่วไป | ชุดของอักขระเดี่ยว | นิพจน์ทั่วไป |
| คืนสินค้า | สตริง[] | โทเค็นผ่านการแจงนับ | สตริง[] |
| รูปแบบที่รวบรวมไว้ | ในทุกการโทร | ไม่สามารถใช้งาน | ครั้งเดียว แล้วนำกลับมาใช้ใหม่ |
| เก็บช่องว่างไว้ | เฉพาะในกรณีที่มีขีดจำกัดติดลบเท่านั้น | ไม่เคย | เฉพาะในกรณีที่มีขีดจำกัดติดลบเท่านั้น |
| สถานะ | แนะนำ | เวอร์ชันดั้งเดิม ถูกเก็บรักษาไว้เพื่อความเข้ากันได้ | แนะนำให้ใช้ในรูปแบบลูป |
ใช้ String.split() เหมาะสำหรับงานทั่วไปที่ทำครั้งเดียว เพราะเขียนสั้นที่สุดและอ่านง่าย คอมไพล์ล่วงหน้าด้วย Pattern.compile(",").split(text) เมื่อทำการแยกภายในลูป เนื่องจากนิพจน์ปกติจะถูกคอมไพล์เพียงครั้งเดียวแทนที่จะเป็นทุกรอบการวนซ้ำ หลีกเลี่ยง StringTokenizer ในโค้ดใหม่ ส่วนนี้ยังคงไว้เพื่อความเข้ากันได้กับเวอร์ชันเก่าเท่านั้น
ร่วมกัน Java ข้อผิดพลาดของฟังก์ชัน split() และวิธีแก้ไข
เกือบทุกปัญหาเกี่ยวกับ split() tracข้อผิดพลาดนี้มักเกิดจากสาเหตุใดสาเหตุหนึ่งในสองประการ คือ อาร์กิวเมนต์เป็นนิพจน์ปกติ (regular expression) แทนที่จะเป็นสตริงตัวอักษร หรือกฎการจำกัดที่อธิบายไว้ข้างต้นกำลังละทิ้งฟิลด์โดยไม่คาดคิด ข้อผิดพลาดแต่ละข้อด้านล่างจะระบุอาการและวิธีแก้ไข
- การแยกโดยใช้จุดทศนิยมจะคืนค่าเป็นอาร์เรย์ว่าง:
"1.2.3".split(".")ตรงกับทุกตัวอักษร เพราะจุดเป็นตัวอักษรตัวแทน (wildcard) ในนิพจน์ปกติ (regex) ต้องใช้การหลีกเลี่ยง (escape) ดังนี้split("\\."). - การแตกของท่อมีพฤติกรรมที่แปลกประหลาด: เครื่องหมายไปป์ (|) หมายถึงการสลับตำแหน่งในนิพจน์ปกติ ให้ใช้เครื่องหมายหลีกเลี่ยง (escape) แทน
split("\\|"). - ข้อผิดพลาดประเภทไม่เข้ากัน: ผลลัพธ์ถูกกำหนดให้กับ
Stringประกาศตัวแปรเป็นString[]. - พบว่าองค์ประกอบแรกว่างเปล่าโดยไม่คาดคิด: ตัวคั่นจะปรากฏที่จุดเริ่มต้นของข้อมูลป้อนเข้า ตัดส่วนที่ไม่จำเป็นออกก่อน
- ค่าที่หายไปในตอนท้าย: ช่องข้อมูลว่างที่อยู่ท้ายสุดจะถูกละทิ้งโดยค่าเริ่มต้น ผ่าน
-1เป็นอาร์กิวเมนต์ที่สอง - NullPointerException:
split()มีการเรียกใช้เมธอดบนค่าอ้างอิงที่เป็น null โปรดตรวจสอบค่า null ก่อนทำการแยก เนื่องจากเมธอดนี้ไม่สามารถจัดการกับค่า null ได้


