Java'da bir dizeden bir c karakterine kadar alt dizgi nasıl elde edilir?


103

Bir dizem var (temelde bir adlandırma kuralını izleyen bir dosya adıdır) abc.def.ghi

Alt dizeyi ilkinden önce çıkarmak istiyorum .(yani bir nokta)

Java doc api'de, String'de bunu yapan bir yöntem bulamıyorum.
Bir şey mi kaçırıyorum? Nasıl yapılır?

Yanıtlar:


64

bak String.indexOfve String.substring.

-1 için kontrol ettiğinizden emin olun indexOf.


1
kısa ve güzel. Ayrıca indexOf'un alt dizenin ilk dizinini verdiğini unutmayın.
Neil Chowdhury

@ Sam B'nin dediği gibi, nasıl kullanılacağını açıklamadınız.
IntelliData

113

Kabul edilen cevap doğrudur, ancak size nasıl kullanılacağını söylememektedir. Bu, indexOf ve alt dize işlevlerini birlikte nasıl kullandığınızdır.

String filename = "abc.def.ghi";     // full file name
int iend = filename.indexOf("."); //this finds the first occurrence of "." 
//in string thus giving you the index of where it is in the string

// Now iend can be -1, if lets say the string had no "." at all in it i.e. no "." is found. 
//So check and account for it.

String subString;
if (iend != -1) 
{
    subString= filename.substring(0 , iend); //this will give abc
}

1
Bu geçersiz bir koddur çünkü bir If İfadesinin gövdesine parantezler olmadan değişken bildirimi koyamazsınız.
Clashsoft

87

Sadece edebilirsiniz bölünmüş dize ..

public String[] split(String regex)

Java.lang.String.split'in sınırlayıcının normal ifade değerini kullandığını unutmayın. Temelde böyle ...

String filename = "abc.def.ghi";     // full file name
String[] parts = filename.split("\\."); // String array, each element is text between dots

String beforeFirstDot = parts[0];    // Text before the first dot

Tabii ki, bu başlık için birden fazla satıra bölünmüştür. Olarak yazılabilir

String beforeFirstDot = filename.split("\\.")[0];

5
Öneriniz doğru değil, çünkü java.lang.String.split yalnızca dize değil, öznitelik olarak normal ifade değerini alıyor. Herşey "." örneğinizde "\\" olarak değiştirilmesi gerekiyor. Sonra işe yarayacak :)
Erik Kaju 9'12

2
Normal ifadeyi seviyorum ama bu beni her seferinde etkiliyor.
Chad Schouggins

73

Projeniz zaten commons-lang kullanıyorsa , StringUtils bu amaç için güzel bir yöntem sağlar:

String filename = "abc.def.ghi";

String start = StringUtils.substringBefore(filename, "."); // returns "abc"

bkz. javadoc [2.6] [3.1]


Diğer çözümlerden daha temiz.
userab

12

ya da şöyle bir şey deneyebilirsin

"abc.def.ghi".substring(0,"abc.def.ghi".indexOf(c)-1);


3
indexOf
-1'i

@Umer Hayat Ya dosya adı ise def.hij.klm? O halde kodunuz nasıl çalışır? (Kodunuz yalnızca bu örnek için işe yarar - aynı zamanda geri dönen bir işlev de yazabilirsiniz "abc"- aynı şekilde çalışacaktır)
Bohemian

@Bohemian: Sınır durumları ve kontrollerin eksik olduğunu biliyorum. Spesifik soruya özel bir cevaptı ve fikir genel fikri bir örnekle vermekti :).
Umer Hayat

1
@TofuBeer: Pekala, daha önce bir karışıklık var "(yani bir nokta)" gerçek gönderide yoktu. Sanırım ve umarım cevabım bu problemi çözmek için genel bir fikir verir.
Umer Hayat

2
Şununla giderdim: int ix = inString.indexOf ('.'); eğer (ix> -1) inString = inString.substring (0, ix); Umer'in neden 1'i çıkarmayı önerdiğini bilmiyorum. İkinci alt dizgenin ikinci argümanı, ancak yine de hariç tutuyor.
Micha Berger

4

Normal ifadeyi kullanmaya ne dersiniz?

String firstWord = filename.replaceAll("\\..*","")

Bu, ilk noktadan sonuna kadar her şeyi "" ile değiştirir (yani onu temizler, size istediğiniz şeyi bırakır)

İşte bir test:

System.out.println("abc.def.hij".replaceAll("\\..*", "");

Çıktı:

abc

7
Olumsuz oy vermedim (ve insanların sebepsiz yere olumsuz oy vermelerinin berbat olduğunu kabul ediyorum) ama çözümünüz oldukça pahalı ve çok açık değil.
TofuBeer

1
@ Knickerless-Noggins Bunu tarif edebilirim, eğer ayrıntılar istiyorsan bunu da yapabilirim ... ama bunu bir yorumda nasıl yapabileceğimi bilmiyorum (belki başka bir soru / cevap yapmalıyım). Pahalıdır çünkü tüm karakterlerin değiştirilmesiyle birlikte yepyeni bir dizge oluşturur. substring, dizeye basitçe bir görünüm döndürür. Bu yardımcı olur?
TofuBeer

2
@TofuBeer yanlışsın. Dizeler değişmezdir . Alt dize gelmez değil bir görünüm döndürür. Bir String yönteminden döndürülen her String, yeni bir String'dir.
Bohemian

@ Knickerless-Noggins O yanılıyor ... Son yorumlara bakın. Ayrıca yeterince etkilidir. Kod yoğunluğu yüksektir - "performans" adına daha fazla kod eklemeyi gerekçelendirmek için yoğun bir şekilde kullanılması gerekir.
Bohemian

Görünüşe göre JDK 7'de değişti, javarevisited.blogspot.ca/2011/10/…
TofuBeer

2

Java.lang.String'de indexOf () gibi bazı yöntemler elde edersiniz: bu size bir char / string'in ilk dizinini döndürür. ve lstIndexOf: size String / char'ın son dizinini döndürür

Java Doc'tan:

  public int indexOf(int ch)
  public int indexOf(String str)

Belirtilen karakterin ilk oluşumunun bu dizge içindeki dizini döndürür .


2

Burada, a'dan Stringverilen karakter listesinden herhangi birine kadar bir alt dizeyi döndüren kod :

/**
 * Return a substring of the given original string until the first appearance
 * of any of the given characters.
 * <p>
 * e.g. Original "ab&cd-ef&gh"
 * 1. Separators {'&', '-'}
 * Result: "ab"
 * 2. Separators {'~', '-'}
 * Result: "ab&cd"
 * 3. Separators {'~', '='}
 * Result: "ab&cd-ef&gh"
 *
 * @param original   the original string
 * @param characters the separators until the substring to be considered
 * @return the substring or the original string of no separator exists
 */
public static String substringFirstOf(String original, List<Character> characters) {
    return characters.stream()
            .map(original::indexOf)
            .filter(min -> min > 0)
            .reduce(Integer::min)
            .map(position -> original.substring(0, position))
            .orElse(original);
}

1

Bu yardımcı olabilir:

public static String getCorporateID(String fileName) {

    String corporateId = null;

    try {
        corporateId = fileName.substring(0, fileName.indexOf("_"));
        // System.out.println(new Date() + ": " + "Corporate:
        // "+corporateId);
        return corporateId;
    } catch (Exception e) {
        corporateId = null;
        e.printStackTrace();
    }

    return corporateId;
}
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.