Dapatkan Substring dari String di Java

1. Gambaran keseluruhan

Dalam tutorial ringkas ini, kita akan menumpukan pada fungsi substring Strings di Java.

Kami kebanyakan akan menggunakan kaedah dari kelas String dan beberapa dari kelas StringUtils Apache Commons .

Dalam semua contoh berikut, kita akan menggunakan String ringkas ini:

String text = "Julia Evans was born on 25-09-1984. " + "She is currently living in the USA (United States of America).";

2. Asas substring

Mari mulakan dengan contoh yang sangat mudah di sini - mengekstrak substring dengan indeks permulaan:

assertEquals("USA (United States of America).", text.substring(67));

Perhatikan bagaimana kita mengambil negara tempat tinggal Julia dalam contoh kita di sini.

Terdapat juga pilihan untuk menentukan indeks akhir , tetapi tanpanya - substring akan sampai ke akhir String.

Mari lakukan itu dan hilangkan titik tambahan pada akhir, seperti contoh di atas:

assertEquals("USA (United States of America)", text.substring(67, text.length() - 1));

Dalam contoh di atas, kami telah menggunakan kedudukan yang tepat untuk mengekstrak substring.

2.1. Mendapat Substring Bermula dengan Karakter Tertentu

Sekiranya kedudukan perlu dikira secara dinamik berdasarkan watak atau String, kita dapat menggunakan kaedah indexOf :

assertEquals("United States of America", text.substring(text.indexOf('(') + 1, text.indexOf(')')));

Kaedah serupa yang dapat membantu kita mencari substring adalah lastIndexOf . Mari gunakan lastIndexOf untuk mengekstrak tahun "1984". Ini adalah bahagian teks antara tanda hubung terakhir dan titik pertama:

assertEquals("1984", text.substring(text.lastIndexOf('-') + 1, text.indexOf('.')));

Kedua indexOf dan lastIndexOf boleh mengambil watak atau String sebagai parameter. Mari kita keluarkan teks "USA" dan selebihnya teks dalam kurungan:

assertEquals("USA (United States of America)", text.substring(text.indexOf("USA"), text.indexOf(')') + 1));

3. Menggunakan subSecence

The String kelas menyediakan kaedah lain yang dipanggil yang berikutnya yang bertindak serupa dengan subrentetan kaedah.

Satu-satunya perbezaan adalah bahawa ia mengembalikan CharSequence dan bukan String dan ia hanya dapat digunakan dengan indeks awal dan akhir tertentu:

assertEquals("USA (United States of America)", text.subSequence(67, text.length() - 1));

4. Menggunakan Ungkapan Biasa

Ungkapan biasa akan menyelamatkan kita jika kita harus mengeluarkan substring yang sesuai dengan corak tertentu.

Dalam contoh String, tarikh lahir Julia adalah dalam format "dd-mm-yyyy". Kita dapat mencocokkan corak ini menggunakan API ekspresi biasa Java.

Pertama sekali, kita perlu membuat corak untuk "dd-mm-yyyy":

Pattern pattern = Pattern.compile("\\d{2}-\\d{2}-\\d{4}");

Kemudian, kami akan menerapkan corak untuk mencari padanan dari teks yang diberikan:

Matcher matcher = pattern.matcher(text);

Setelah berjaya, kita dapat mengekstrak String yang sesuai :

if (matcher.find()) { Assert.assertEquals("25-09-1984", matcher.group()); }

Untuk maklumat lebih lanjut mengenai ungkapan biasa Java, lihat tutorial ini.

5. Menggunakan perpecahan

Kita boleh menggunakan kaedah split dari kelas String untuk mengekstrak substring. Katakanlah kita ingin mengeluarkan ayat pertama dari rentetan contoh . Ini cukup mudah dilakukan dengan menggunakan split :

String[] sentences = text.split("\\.");

Oleh kerana kaedah split menerima regex maka kita harus melepaskan watak noktah. Kini hasilnya adalah susunan 2 ayat.

Kita boleh menggunakan ayat pertama (atau mengulangi keseluruhan susunan):

assertEquals("Julia Evans was born on 25-09-1984", sentences[0]);

Harap maklum bahawa ada cara yang lebih baik untuk mengesan ayat dan tokenisasi menggunakan Apache OpenNLP. Lihat tutorial ini untuk mengetahui lebih lanjut mengenai OpenNLP API.

6. Menggunakan Pengimbas

Kami biasanya menggunakan Scanner untuk menguraikan jenis primitif dan String menggunakan ungkapan biasa. A Scanner memecah input ke dalam token menggunakan corak pembatas , yang secara lalai perlawanan ruang kosong.

Mari cari cara menggunakan ini untuk mendapatkan ayat pertama dari teks contoh:

try (Scanner scanner = new Scanner(text)) { scanner.useDelimiter("\\."); assertEquals("Julia Evans was born on 25-09-1984", scanner.next()); }

Dalam contoh di atas, kami telah menetapkan contoh String sebagai sumber pengimbas untuk digunakan.

Kemudian kita menetapkan watak noktah sebagai pembatas (yang perlu dilarikan jika tidak, ia akan dianggap sebagai watak ekspresi biasa khas dalam konteks ini).

Akhirnya, kami menegaskan token pertama dari output yang dibatasi ini.

Sekiranya diperlukan, kita dapat melakukan pengulangan melalui koleksi token lengkap menggunakan loop sementara .

while (scanner.hasNext()) { // do something with the tokens returned by scanner.next() }

7. Pergantungan Maven

Kita boleh melangkah lebih jauh dan menggunakan utiliti yang berguna - kelas StringUtils - bahagian dari perpustakaan Apache Commons Lang:

 org.apache.commons commons-lang3 3.8 

Anda boleh mendapatkan versi terbaru perpustakaan ini di sini.

8. Menggunakan StringUtils

The Apache Commons libraries add some useful methods for manipulating core Java types. Apache Commons Lang provides a host of helper utilities for the java.lang API, most notably String manipulation methods.

In this example, we're going to see how to extract a substring nested between two Strings:

assertEquals("United States of America", StringUtils.substringBetween(text, "(", ")"));

There is a simplified version of this method in case the substring is nested in between two instances of the same String:

substringBetween(String str, String tag)

The substringAfter method from the same class gets the substring after the first occurrence of a separator.

The separator isn't returned:

assertEquals("the USA (United States of America).", StringUtils.substringAfter(text, "living in "));

Similarly, the substringBefore method gets the substring before the first occurrence of a separator.

The separator isn't returned:

assertEquals("Julia Evans", StringUtils.substringBefore(text, " was born"));

Anda boleh melihat tutorial ini untuk mengetahui lebih lanjut mengenai pemprosesan String menggunakan Apache Commons Lang API.

9. Kesimpulannya

Dalam artikel ringkas ini, kami menemukan pelbagai cara untuk mengekstrak substring dari String di Java. Anda boleh meneroka tutorial lain mengenai manipulasi String di Java.

Seperti biasa, coretan kod boleh didapati di GitHub.