Java เมธอด split() ของสตริง พร้อมตัวอย่าง

⚡ สรุปอย่างชาญฉลาด

แยกสตริงเข้า Java โดยใช้เมธอด split() ซึ่งจะแบ่งข้อความทุกครั้งที่พบตัวคั่น และส่งคืนส่วนต่างๆ ในรูปแบบอาร์เรย์สตริง มีอาร์กิวเมนต์ limit ที่เป็นตัวเลือกเพื่อจำกัดจำนวนส่วนที่จะแบ่ง โดยส่วนที่เหลือจะยังคงอยู่เหมือนเดิม

  • 🧩 ประเภทการส่งคืน: ฟังก์ชัน split() จะคืนค่าเป็น String[] ไม่ใช่ String ตัวเดียว ดังนั้นผลลัพธ์จะต้องถูกกำหนดให้กับอาร์เรย์
  • 🔤 ตัวคั่นคือ Regex: อาร์กิวเมนต์เป็นนิพจน์ปกติ ดังนั้นอักขระเช่นจุดและเครื่องหมายไปป์จึงต้องใช้การหลีกเลี่ยง (esca)ping.
  • 🔢 ข้อจำกัดของอาร์กิวเมนต์: การกำหนดค่าเกิน 3 จะสร้างชิ้นส่วนที่แยกออกเป็นสองส่วน และคงส่วนที่เหลือของข้อความไว้เป็นองค์ประกอบสุดท้าย
  • รูปแบบช่องว่าง: รูปแบบ \\s จะตรงกับอักขระเว้นวรรคเดี่ยวใดๆ ก็ได้ ซึ่งจะแบ่งประโยคออกเป็นคำๆ
  • 🕳️ ช่องว่างท้ายประโยค: ฟิลด์ท้ายที่ว่างเปล่าจะถูกละทิ้ง เว้นแต่จะมีการระบุค่าขีดจำกัดที่เป็นลบ
  • 🔁 ผลการค้นหา: การใช้ลูป for มาตรฐานวนซ้ำตามความยาวของอาร์เรย์ จะพิมพ์แต่ละส่วนตามลำดับ

Java วิธีการแยกสตริง ()

สตริง 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, ซิกมา — คั่นด้วยเครื่องหมายจุลภาค (,)

 แยกสตริงเข้า Java

ในที่นี้หากเราต้องการสตริงเดี่ยวๆ ทั้งหมด รูปแบบที่ดีที่สุดที่เป็นไปได้คือการแยกมันตามเครื่องหมายจุลภาค ดังนั้นเราจะได้ 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แต่ต้องการให้ส่วนที่เหลือของสตริงคงเดิม ผลลัพธ์ที่ได้ควรมีลักษณะดังนี้:

  1. แอลฟา
  2. เบต้า
  3. 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 ได้

คำถามที่พบบ่อย

ใช้คลาสตัวละคร เช่น split("[,;]")ซึ่งจะแบ่งเมื่อเจอกับเครื่องหมายจุลภาคหรือเครื่องหมายอัฒภาค การสลับกันก็ใช้ได้เช่นกัน: split(",|;").

ใช่ ห่ออาร์เรย์ด้วย Arrays.asList(text.split(",")) สำหรับมุมมองที่มีขนาดคงที่ หรือ new ArrayList<>(Arrays.asList(...)) เมื่อจำเป็นต้องแก้ไขรายการในภายหลัง

ใช่. AI เครื่องมือจะสร้างรูปแบบการทำงานจากรูปแบบที่อธิบายไว้และอธิบายแต่ละโทเค็น ทดสอบผลลัพธ์กับกรณีพิเศษ เช่น ช่องว่างและค่าที่อยู่ในเครื่องหมายคำพูด ก่อนที่จะเชื่อถือได้

ผู้ช่วย AI จะระบุว่าสาเหตุเกิดจากอักขระพิเศษที่ไม่ได้หลีกเลี่ยง ฟิลด์ท้ายที่ถูกทิ้ง หรือตัวคั่นนำหน้า ซึ่งเป็นสามคำอธิบายสำหรับความยาวอาร์เรย์ที่ไม่คาดฝัน

เหมาะสำหรับข้อมูลแบบง่ายเท่านั้น ไม่สามารถจัดการกับเครื่องหมายจุลภาคภายในฟิลด์ที่อยู่ในเครื่องหมายคำพูดหรือการขึ้นบรรทัดใหม่แบบฝังได้ ดังนั้นการใช้ไลบรารี CSV เฉพาะทางจึงปลอดภัยกว่าสำหรับไฟล์จริง การอ่านทีละบรรทัดด้วย BufferedReader เข้ากันได้ดีกับห้องสมุดประเภทนี้

สรุปโพสต์นี้ด้วย: