ฉันเห็นเฉพาะวิธีแก้ปัญหาที่นี่ แต่ไม่มีคำอธิบายทั้งหมดของปัญหาดังนั้นฉันจึงตัดสินใจโพสต์คำตอบนี้
ปัญหา
text.split(delim)
คุณจำเป็นต้องรู้เกี่ยวกับบางสิ่ง split
วิธี:
- ยอมรับเป็นนิพจน์ทั่วไปของอาร์กิวเมนต์(regex) ซึ่งอธิบายถึงตัวคั่นที่เราต้องการแยก
- หาก
delim
มีอยู่ในตอนท้ายของtext
like 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 หลบหนีให้คุณ