Di java bagaimana cara mendapatkan substring dari string sampai karakter c?


102

Saya memiliki string (yang pada dasarnya adalah nama file yang mengikuti konvensi penamaan) abc.def.ghi

Saya ingin mengekstrak substring sebelum yang pertama .(yaitu titik)

Dalam java doc api, saya tidak bisa menemukan metode dalam String yang melakukan itu.
Apakah saya melewatkan sesuatu? Bagaimana cara melakukannya?

Jawaban:


64

lihat String.indexOfdan String.substring.

Pastikan Anda memeriksa -1 untuk indexOf.


1
pendek dan manis. Juga ingat bahwa indexOf memberikan indeks pertama dari substring.
Neil Chowdhury

112

Jawaban yang diterima benar tetapi tidak memberi tahu Anda cara menggunakannya. Ini adalah cara Anda menggunakan indexOf dan fungsi substring secara bersamaan.

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
Ini adalah kode yang tidak valid karena Anda tidak dapat meletakkan deklarasi variabel di badan Pernyataan If tanpa kurung kurawal.
Clashsoft

85

Anda bisa membagi string ..

public String[] split(String regex)

Perhatikan bahwa java.lang.String.split menggunakan nilai ekspresi reguler pembatas. Pada dasarnya seperti ini ...

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

Tentu saja, ini dibagi menjadi beberapa baris untuk kejelasan. Itu bisa ditulis sebagai

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

5
Proposal Anda tidak benar, karena java.lang.String.split menggunakan nilai regex sebagai atribut, bukan hanya string. Semua "." dalam contoh Anda perlu diubah menjadi "\\." Maka itu akan berhasil :)
Erik Kaju

2
Saya suka regex, tapi itu selalu mempengaruhi saya.
Chad Schouggins

71

Jika proyek Anda sudah menggunakan commons-lang , StringUtils menyediakan metode yang bagus untuk tujuan ini:

String filename = "abc.def.ghi";

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

lihat javadoc [2.6] [3.1]


Lebih bersih dari solusi lain.
userab

12

atau Anda dapat mencoba sesuatu seperti

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


3
akan crash 'c' tidak dalam string karena indexOf akan mengembalikan -1
TofuBeer

@Umer Hayat Bagaimana jika nama filenya def.hij.klm? Bagaimana cara kerja kode Anda? (Kode Anda hanya bekerja untuk satu contoh ini - Anda mungkin juga menulis fungsi yang mengembalikan "abc"- itu akan bekerja dengan baik)
Bohemian

@Bohemian: Saya tahu ada kasus batas dan pemeriksaan hilang. Itu adalah jawaban khusus untuk pertanyaan dan ide khusus adalah memberikan gambaran umum melalui contoh :).
Umer Hayat

1
@TofuBeer: Oke, ada kebingungan sebelumnya "(yaitu titik)" tidak ada di pos yang sebenarnya. Saya berpikir dan berharap jawaban saya memberikan gambaran umum untuk menyelesaikan masalah kerabat ini.
Umer Hayat

2
Saya akan menggunakan: int ix = inString.indexOf ('.'); jika (ix> -1) inString = inString.substring (0, ix); Saya tidak tahu mengapa Umer menyarankan pengurangan 1. Argumen kedua substring terserah tetapi tidak termasuk.
Micha Berger

4

Bagaimana kalau menggunakan regex?

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

Ini menggantikan semuanya dari titik pertama sampai akhir dengan "" (yaitu menghapusnya, meninggalkan Anda dengan apa yang Anda inginkan)

Berikut tesnya:

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

Keluaran:

abc

7
Saya tidak downvote, (dan saya setuju itu payah ketika orang downvote tanpa alasan) tetapi solusi Anda cukup mahal dan tidak terlalu jelas.
TofuBeer

1
@ Knickerless-Noggins Saya dapat menjelaskannya, jika Anda ingin yang spesifik saya dapat melakukannya juga ... tetapi tidak yakin bagaimana saya bisa melakukannya dalam komentar (mungkin harus melakukan tanya jawab lain). Ini mahal karena menciptakan string baru bersama dengan semua karakter yang diganti. substring hanya mengembalikan tampilan ke dalam string. Bantuan itu?
TofuBeer

2
@TofuBeer Anda salah. String tidak bisa diubah . Substring tidak mengembalikan tampilan. Setiap String yang dikembalikan dari metode String adalah String baru .
Bohemian

@ Knickerless-Noggins Dia salah ... Lihat komentar terbaru. Juga, itu cukup efektif. Kepadatan kode tinggi - itu harus digunakan secara intens untuk membenarkan penambahan lebih banyak kode demi "kinerja".
Bohemian

Ternyata berubah di JDK 7, javarevisited.blogspot.ca/2011/10/…
TofuBeer

2

Di java.lang.String Anda mendapatkan beberapa metode seperti indexOf (): yang mengembalikan Anda indeks pertama dari sebuah char / string. dan lstIndexOf: yang mengembalikan Anda indeks terakhir dari String / char

Dari Java Doc:

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

Mengembalikan indeks dalam string ini dari kemunculan pertama dari karakter yang ditentukan.


2

Berikut adalah kode yang mengembalikan substring dari a Stringhingga salah satu dari daftar karakter yang diberikan:

/**
 * 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

Ini bisa membantu:

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;
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.