Java: Belirli bir karakterden başlayarak dizeden bir alt dize alma


198

Bir dize var:

/abc/def/ghfj.doc

Bundan ghfj.doc, yani sondan sonra /veya /sağdan önce alt dize ayıklamak istiyorum .

Birisi yardım edebilir mi?


40
Bak, soru sormadan önce cevabı kendiniz aramanın değerini anlıyorum, ama işin aslı bu soru, araştırmamı çok daha kolay hale getirdi .. tam olarak ilk vuruştan sonra istediğim şey. Javadoc'lara danışmaktan daha hızlı. Bu sorunun burada olması güzel. Neden inişler?
Eric

3
Bu, orijinal sorunuzdan biraz farklı olsa da: Örneğinizde, org.apache.commons.io.FilenameUtils.getBaseName, kendi dize işlemlerinizi yapmaktan çok daha güvenilirdir.
kadar Schäfer

4
@Eric Soruya ilk Google sonucu olduğu ve kabul edilen cevap tam olarak kullanmam gereken şey olduğu için yorumunuza tamamen katılıyorum.
thonnor

Yanıtlar:



42

Çok basit bir uygulama 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
bu kod, ayırıcı bulunamazsa bir Dizi Dizini Sınırların Dışına hatası atar.
Patrick Parker

36

ne denedin çok basit:

String s = "/abc/def/ghfj.doc";
s.substring(s.lastIndexOf("/") + 1)

24

Bir başka yolu kullanmaktır bu .

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

Bu yönteme null değerini iletirseniz null değerini döndürür. Ayırıcı ile eşleşme yoksa, boş dize döndürür.


1
Sonunda gerçekten kullanışlı bir şey, bu yöntem hakkında bilmiyordum. Subring + indexof + 1 - 2 +3 ile uğraşmaktan nefret ediyorum. Bu çok daha temiz :)
BAERUS

Android'de bu yöntemi kullanmak istiyorsanız, StringUtilskitaplığı içe aktarmanız gerekir , bu cevap bunu yapmak için sıcak gösterir: stackoverflow.com/a/33935645/2966583
stramin

9

Apache ortaklarını kullanabilirsiniz:

Son oluşumdan sonra alt dize için bu yöntemi kullanın .

Ve ilk oluşumdan sonra alt dize için eşdeğer yöntem burada .


4

Bu dosya adını da alabilir

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

Yazdırılacak ghfj.doc



1

Kotlin'de substringAfterLast, bir sınırlayıcı belirterek kullanabilirsiniz .

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

Gönderen doc :

Sınırlayıcının son oluşumundan sonra bir alt dize döndürür. Dize ayırıcı içermiyorsa, varsayılan olarak orijinal dizeyi içeren missingDelimiterValue değerini döndürür.


0

Doğrudan split işlevini kullanırsak bunun daha iyi olacağını düşünüyorum.

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

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

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

ayırıcı bulunmazsa bu kod hata verir.
Patrick Parker

@PatrickParker Ayırıcı bulunamazsa neden her yere bir hata atacağını açıkladınız. Eğer bunu bilgiden daha iyi amaçlı yapıyorsanız, ama bence bu biraz fazla olabilir ...
Gaurav Mall

@GauravMall İnsanların cevaplarını geliştirmelerine, daha iyi kod yazmalarına ve tuzaklardan kaçınmalarına yardımcı olmak için ziyaret edenlere ve bir yere yapıştırmadan önce kodu anlamalarına yardımcı oluyorum. Yanıt geliştirildikten sonra yorumumu memnuniyetle kaldıracağım. Ayrıca, iki yerde yazmak zor "her yerde". Son olarak, yorum bölümü meta tartışma için değildir.
Patrick Parker
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.