Java: การรับค่าสตริงย่อยจากสตริงเริ่มต้นหลังจากอักขระเฉพาะ


198

ฉันมีสตริง:

/abc/def/ghfj.doc

ฉันต้องการแยกghfj.docจากนี้คือสตริงย่อยหลังสุดท้าย/หรือ/จากขวา

ใครช่วยกรุณาช่วยบ้าง


40
ดูฉันเข้าใจคุณค่าของการค้นหาคำตอบด้วยตัวเองก่อนถามคำถาม แต่ความจริงของเรื่องนี้คือคำถามนี้ทำให้การค้นหาของฉันง่ายขึ้นมาก .. สิ่งที่ฉันต้องการหลังจากตีครั้งแรก เร็วกว่าการให้คำปรึกษา javadocs เป็นเรื่องดีที่คำถามนี้อยู่ที่นี่ ทำไมต้องลงคะแนน?
Eric

3
แม้ว่าสิ่งนี้จะค่อนข้างแตกต่างจากคำถามเดิมของคุณ: ในตัวอย่าง org.apache.commons.io.FilenameUtils.getBaseName ของคุณนั้นมีความน่าเชื่อถือมากกว่าการดำเนินการกับสตริงของคุณเอง
จนถึงSchäfer

4
@Eric ฉันเห็นด้วยอย่างยิ่งกับความคิดเห็นของคุณเนื่องจากนี่เป็นผลลัพธ์ครั้งแรกของ Google สำหรับคำถามของฉันและคำตอบที่ยอมรับคือสิ่งที่ฉันต้องการใช้
thonnor

คำตอบ:



42

การใช้งานที่ง่ายมากด้วยString.split():

String path = "/abc/def/ghfj.doc";
// Split path into segments
String segments[] = path.split("/");
// Grab the last segment
String document = segments[segments.length - 1];

1
รหัสนี้จะโยนข้อผิดพลาด Array Index Out of Bounds หากไม่พบตัวคั่น
Patrick Parker


24

อีกวิธีหนึ่งคือการใช้นี้

String path = "/abc/def/ghfj.doc"
String fileName = StringUtils.substringAfterLast(path, "/");

ถ้าคุณผ่านโมฆะไปที่วิธีนี้มันจะกลับมาเป็นโมฆะ หากไม่มีการจับคู่กับตัวคั่นมันจะกลับสตริงที่ว่างเปล่า


1
ในที่สุดสิ่งที่มีประโยชน์จริงๆไม่ทราบเกี่ยวกับวิธีนี้ ฉันไม่ชอบวุ่นวายกับ substring + indexof + 1 - 2 +3 แต่อย่างใด นี่คือทำความสะอาดมาก :)
BAERUS

หากคุณต้องการใช้วิธีนี้บน Android คุณต้องนำเข้าStringUtilsห้องสมุดคำตอบนี้แสดงให้เห็นว่าน่าสนใจมาก: stackoverflow.com/a/33935645/2966583
stramin

9

คุณสามารถใช้ Apache Commons:

สำหรับ substring หลังการใช้งานเกิดขึ้นครั้งล่าสุดนี้วิธีการ

และสำหรับ substring หลังจากที่เกิดขึ้นครั้งแรกวิธีเทียบเท่าเป็นที่นี่


4

นอกจากนี้ยังสามารถรับชื่อไฟล์

import java.nio.file.Paths;
import java.nio.file.Path;
Path path = Paths.get("/abc/def/ghfj.doc");
System.out.println(path.getFileName().toString());

จะพิมพ์ ghfj.doc


2

ด้วยGuava ให้ทำสิ่งนี้:

String id="/abc/def/ghfj.doc";
String valIfSplitIsEmpty="";
return Iterables.getLast(Splitter.on("/").split(id),valIfSplitIsEmpty);

กำหนดค่าSplitterและใช้งานในที่สุด

Splitter.on("/")
.trimResults()
.omitEmptyStrings()
...

ดูที่บทความนี้เกี่ยวกับตัวแยกฝรั่งและบทความเกี่ยวกับฝรั่ง Iterables


1

ใน Kotlin คุณสามารถใช้substringAfterLastระบุตัวคั่น

val string = "/abc/def/ghfj.doc"
val result = url.substringAfterLast("/")
println(result)
// It will show ghfj.doc

จากเอกสาร :

ส่งคืนสตริงย่อยหลังจากการเกิดขึ้นครั้งสุดท้ายของตัวคั่น หากสตริงไม่มีตัวคั่นให้ส่งคืน missingDelimiterValue ซึ่งจะใช้ค่าเริ่มต้นเป็นสตริงเดิม


0

ฉันคิดว่ามันจะดีกว่าถ้าเราใช้ฟังก์ชั่นแยกโดยตรง

String toSplit = "/abc/def/ghfj.doc";

String result[] = toSplit.split("/");

String returnValue = result[result.length - 1]; //equals "ghfj.doc"

รหัสนี้จะเกิดข้อผิดพลาดหากไม่พบตัวคั่น
Patrick Parker

@PatrickParker ทำไมคุณถึงแสดงความคิดเห็นทุกที่ว่าจะทำให้เกิดข้อผิดพลาดหากไม่พบตัวคั่น หากคุณกำลังทำเพื่อความรู้มากกว่าโอเค แต่ฉันคิดว่ามันอาจจะมากเกินไป ...
Gaurav Mall

@GauravMall ฉันกำลังช่วยผู้คนในการปรับปรุงคำตอบของพวกเขาเขียนโค้ดที่ดีขึ้นและสำหรับผู้ที่เยี่ยมชมเพื่อช่วยพวกเขาหลีกเลี่ยงข้อผิดพลาดและสร้างความเข้าใจเกี่ยวกับรหัสก่อนที่จะวางลงที่อื่น ฉันยินดีที่จะลบความคิดเห็นของฉันเมื่อคำตอบดีขึ้น นอกจากนี้การเขียนมันในสองแห่งก็แทบจะไม่ "ทุกที่" สุดท้ายส่วนความคิดเห็นไม่ได้มีไว้สำหรับการสนทนาเมตา
Patrick Parker
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.