ฉันเห็นเฉพาะวิธีแก้ปัญหาที่นี่ แต่ไม่มีคำอธิบายทั้งหมดของปัญหาดังนั้นฉันจึงตัดสินใจโพสต์คำตอบนี้
ปัญหา
text.split(delim)คุณจำเป็นต้องรู้เกี่ยวกับบางสิ่ง splitวิธี:
- ยอมรับเป็นนิพจน์ทั่วไปของอาร์กิวเมนต์(regex) ซึ่งอธิบายถึงตัวคั่นที่เราต้องการแยก
- หาก
delimมีอยู่ในตอนท้ายของtextlike a,b,c,,(โดยที่ตัวคั่นอยู่,) splitในตอนแรกจะสร้างอาร์เรย์เหมือน["a" "b" "c" "" ""]แต่ในกรณีส่วนใหญ่เราไม่ต้องการสตริงว่างต่อท้ายเหล่านี้จริงๆมันจะลบออกโดยอัตโนมัติสำหรับเราด้วย ดังนั้นมันจะสร้างอาร์เรย์อื่นโดยไม่ได้เหล่านี้สตริงว่างต่อท้ายและผลตอบแทนมัน
นอกจากนี้คุณยังจำเป็นต้องรู้ว่าจุด.เป็นอักขระพิเศษในregex แสดงถึงอักขระใด ๆ (ยกเว้นตัวคั่นบรรทัด แต่สามารถเปลี่ยนได้ด้วยPattern.DOTALLแฟล็ก)
ดังนั้นสำหรับสตริงเช่น"abc"ถ้าเราแยก"." splitวิธีจะ
- สร้างอาร์เรย์เช่น
["" "" "" ""],
- แต่เนื่องจากอาร์เรย์นี้มีสตริงว่างเท่านั้นและทุกอย่างต่อท้ายจึงจะถูกลบออก
ซึ่งหมายความว่าเราจะได้อาร์เรย์ว่างเป็นผลลัพธ์[](โดยไม่มีองค์ประกอบหรือแม้แต่สตริงว่างเปล่า) ดังนั้นเราจึงไม่สามารถใช้งานได้fn[0]เนื่องจากไม่มีดัชนี 0
วิธีการแก้
ในการแก้ปัญหานี้คุณต้องสร้าง regex ซึ่งจะแทนจุด ในการทำเช่นนั้นเราจำเป็นต้องหลีกหนีสิ่ง.นั้น มีไม่กี่วิธีในการทำ แต่วิธีที่ง่ายที่สุดคือการใช้\(ซึ่งใน String จำเป็นต้องเขียนเป็น"\\"เพราะ\มีความพิเศษเช่นกันและต้องใช้อีกวิธีหนึ่ง\ในการหลีกเลี่ยง)
ดังนั้นวิธีแก้ปัญหาของคุณอาจมีลักษณะดังนี้
String[] fn = filename.split("\\.");
โบนัส
คุณยังสามารถใช้วิธีอื่นเพื่อหลีกเลี่ยงจุดนั้นเช่น
- โดยใช้คลาสอักขระ
split("[.]")
- ห่อไว้ในใบเสนอราคา
split("\\Q.\\E")
- ใช้อินสแตนซ์ Pattern ที่เหมาะสมพร้อม
Pattern.LITERALแฟล็ก
- หรือเพียงแค่ใช้
split(Pattern.quote("."))และปล่อยให้ regex หลบหนีให้คุณ