Pertanyaan Cara membagi string di Java


Saya memiliki sebuah string, "004-034556", yang ingin saya bagi menjadi dua string:

string1=004
string2=034556

Itu berarti string pertama akan berisi karakter sebelumnya '-', dan string kedua akan berisi karakter setelahnya '-'. Saya juga ingin memeriksa apakah string itu ada '-' di dalamnya. Jika tidak, saya akan melempar pengecualian. Bagaimana saya bisa melakukan ini?


1278
2017-08-14 03:01


asal


Jawaban:


Cukup gunakan metode yang sesuai: String#split().

String string = "004-034556";
String[] parts = string.split("-");
String part1 = parts[0]; // 004
String part2 = parts[1]; // 034556

Perhatikan bahwa ini membutuhkan ekspresi reguler, jadi ingatlah untuk melarikan diri karakter spesial jika diperlukan.

sana adalah 12 karakter dengan arti khusus: backslash \, tanda sisipan ^, tanda dolar $, periode atau titik ., batang vertikal atau simbol pipa |, tanda tanya ?, tanda bintang atau bintang *, tanda tambah +, kurung buka (, tanda kurung tutup ), dan braket persegi pembukaan [, kurung kurawal buka {, Karakter khusus ini sering disebut "metacharacters".

Jadi, jika Anda ingin berpisah pada mis. titik / titik . yang berarti "karakter apa saja"dalam regex, gunakan juga backslash \ untuk melarikan diri dari karakter khusus individu seperti itu split("\\."), atau digunakan kelas karakter [] untuk merepresentasikan karakter literal seperti itu split("[.]"), atau digunakan Pattern#quote() untuk melarikan diri dari seluruh string seperti itu split(Pattern.quote(".")).

String[] parts = string.split(Pattern.quote(".")); // Split on period.

Untuk menguji sebelumnya jika string mengandung karakter tertentu, gunakan saja String#contains().

if (string.contains("-")) {
    // Split it.
} else {
    throw new IllegalArgumentException("String " + string + " does not contain -");
}

Perhatikan, ini tidak mengambil ekspresi reguler. Untuk itu, gunakan String#matches() sebagai gantinya.

Jika Anda ingin mempertahankan karakter split di bagian yang dihasilkan, maka gunakan lookaround positif. Jika Anda ingin memiliki karakter split berakhir di sisi kiri, gunakan tampilan positif dengan awalan ?<= kelompok pada pola.

String string = "004-034556";
String[] parts = string.split("(?<=-)");
String part1 = parts[0]; // 004-
String part2 = parts[1]; // 034556

Jika Anda ingin memiliki karakter split berakhir di sisi kanan, gunakan lookahead positif dengan awalan ?= kelompok pada pola.

String string = "004-034556";
String[] parts = string.split("(?=-)");
String part1 = parts[0]; // 004
String part2 = parts[1]; // -034556

Jika Anda ingin membatasi jumlah bagian yang dihasilkan, maka Anda dapat memberikan nomor yang diinginkan sebagai argumen ke-2 split() metode.

String string = "004-034556-42";
String[] parts = string.split("-", 2);
String part1 = parts[0]; // 004
String part2 = parts[1]; // 034556-42

2349
2017-08-14 03:05



Alternatif untuk memproses string secara langsung adalah dengan menggunakan ekspresi reguler dengan menangkap grup. Ini memiliki keuntungan yang membuatnya mudah untuk mengimplikasikan kendala yang lebih canggih pada input. Sebagai contoh, berikut membagi string menjadi dua bagian, dan memastikan bahwa keduanya hanya terdiri dari angka:

import java.util.regex.Pattern;
import java.util.regex.Matcher;

class SplitExample
{
    private static Pattern twopart = Pattern.compile("(\\d+)-(\\d+)");

    public static void checkString(String s)
    {
        Matcher m = twopart.matcher(s);
        if (m.matches()) {
            System.out.println(s + " matches; first part is " + m.group(1) +
                               ", second part is " + m.group(2) + ".");
        } else {
            System.out.println(s + " does not match.");
        }
    }

    public static void main(String[] args) {
        checkString("123-4567");
        checkString("foo-bar");
        checkString("123-");
        checkString("-4567");
        checkString("123-4567-890");
    }
}

Karena pola telah diperbaiki dalam contoh ini, pola dapat dikompilasi terlebih dahulu dan disimpan sebagai anggota statis (diinisialisasi pada waktu muat kelas dalam contoh). Ekspresi regulernya adalah:

(\d+)-(\d+)

Tanda kurung menunjukkan kelompok penangkap; string yang cocok dengan bagian regexp itu dapat diakses oleh metode Match.group (), seperti yang ditunjukkan. Pencocokan \ d dan digit desimal tunggal, dan tanda + berarti "cocok dengan satu atau lebih dari ekspresi sebelumnya." - tidak memiliki arti khusus, jadi hanya cocok dengan karakter tersebut dalam masukan. Perhatikan bahwa Anda perlu meloloskan diri dari backslashes saat menulis ini sebagai string Java Beberapa contoh lainnya:

([A-Z]+)-([A-Z]+)          // Each part consists of only capital letters 
([^-]+)-([^-]+)            // Each part consists of characters other than -
([A-Z]{2})-(\d+)           // The first part is exactly two capital letters,
                           // the second consists of digits

68
2017-08-14 11:28



String[] result = yourString.split("-");
if (result.length != 2) 
     throw new IllegalArgumentException("String not in correct format");

Ini akan membagi string Anda menjadi 2 bagian. Elemen pertama dalam array akan menjadi bagian yang berisi hal-hal sebelum -, dan elemen ke-2 dalam larik akan berisi bagian string Anda setelah -.

Jika panjang larik tidak 2, maka string itu tidak dalam format: string-string.

Lihat split() metode dalam String kelas.

https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#split-java.lang.String-int-


39
2017-08-14 03:06



// This leaves the regexes issue out of question
// But we must remember that each character in the Delimiter String is treated
// like a single delimiter        

public static String[] SplitUsingTokenizer(String subject, String delimiters) {
   StringTokenizer strTkn = new StringTokenizer(subject, delimiters);
   ArrayList<String> arrLis = new ArrayList<String>(subject.length());

   while(strTkn.hasMoreTokens())
      arrLis.add(strTkn.nextToken());

   return arrLis.toArray(new String[0]);
}

26
2017-11-16 06:30



String[] out = string.split("-");

harus melakukan hal yang Anda inginkan. Kelas String memiliki banyak metode untuk beroperasi dengan string.


23
2017-08-14 03:06



Persyaratan meninggalkan ruang untuk interpretasi. Saya merekomendasikan menulis sebuah metode,

public final static String[] mySplit(final String s)

yang mengenkapsulasi fungsi ini. Tentu saja Anda dapat menggunakan String.split (..) sebagaimana disebutkan dalam jawaban lain untuk implementasi.

Anda harus menulis beberapa tes unit untuk string input dan hasil dan perilaku yang diinginkan.

Kandidat uji yang baik harus mencakup:

 - "0022-3333"
 - "-"
 - "5555-"
 - "-333"
 - "3344-"
 - "--"
 - ""
 - "553535"
 - "333-333-33"
 - "222--222"
 - "222--"
 - "--4555"

Dengan mendefinisikan hasil tes yang sesuai, Anda dapat menentukan perilaku.

Misalnya, jika "-333" harus kembali masuk [,333] atau jika itu adalah kesalahan. Bisa "333-333-33" dipisahkan dalam [333,333-33] or [333-333,33] atau apakah itu kesalahan? Dan seterusnya.


17
2017-08-14 06:57



Berasumsi bahwa

  • Anda tidak benar-benar membutuhkan ekspresi reguler untuk perpecahan Anda
  • Anda kebetulan sudah menggunakan apache commons lang di aplikasi Anda

Cara termudah adalah menggunakan StringUtils # split (java.lang.String, char). Itu lebih mudah daripada yang diberikan oleh Java di luar kotak jika Anda tidak perlu ekspresi reguler. Seperti manualnya mengatakan, ia bekerja seperti ini:

A null input String returns null.

 StringUtils.split(null, *)         = null
 StringUtils.split("", *)           = []
 StringUtils.split("a.b.c", '.')    = ["a", "b", "c"]
 StringUtils.split("a..b.c", '.')   = ["a", "b", "c"]
 StringUtils.split("a:b:c", '.')    = ["a:b:c"]
 StringUtils.split("a b c", ' ')    = ["a", "b", "c"]

Saya akan merekomendasikan menggunakan komong-lang, karena biasanya berisi banyak hal yang dapat digunakan. Namun, jika Anda tidak membutuhkannya untuk hal lain selain melakukan split, maka menerapkan sendiri atau melarikan diri dari regex adalah opsi yang lebih baik.


15
2018-03-25 06:43



Menggunakan org.apache.commons.lang.StringUtils ' metode split yang dapat membagi string berdasarkan karakter atau string yang ingin Anda bagi.

Tanda tangan metode:

public static String[] split(String str, char separatorChar);

Dalam kasus Anda, Anda ingin membagi string ketika ada "-".

Anda cukup lakukan sebagai berikut:

String str = "004-034556";

String split[] = StringUtils.split(str,"-");

Keluaran:

004
034556

Asumsikan bahwa jika - tidak ada dalam string Anda, mengembalikan string yang diberikan, dan Anda tidak akan mendapatkan pengecualian apa pun.


15
2017-07-01 04:35



Anda dapat mencoba seperti ini juga

 String concatenated_String="hi^Hello";

 String split_string_array[]=concatenated_String.split("\\^");

14
2018-01-15 09:58



Dengan Java 8:

    List<String> stringList = Pattern.compile("-")
            .splitAsStream("004-034556")
            .collect(Collectors.toList());

    stringList.forEach(s -> System.out.println(s));

14
2017-12-01 09:32



String Split dengan banyak karakter menggunakan Regex

public class StringSplitTest {
     public static void main(String args[]) {
        String s = " ;String; String; String; String, String; String;;String;String; String; String; ;String;String;String;String";
        //String[] strs = s.split("[,\\s\\;]");
        String[] strs = s.split("[,\\;]");
        System.out.println("Substrings length:"+strs.length);
        for (int i=0; i < strs.length; i++) {
            System.out.println("Str["+i+"]:"+strs[i]);
        }
     }
  }

Keluaran:

Substrings length:17
Str[0]:
Str[1]:String
Str[2]: String
Str[3]: String
Str[4]: String
Str[5]: String
Str[6]: String
Str[7]:
Str[8]:String
Str[9]:String
Str[10]: String
Str[11]: String
Str[12]:
Str[13]:String
Str[14]:String
Str[15]:String
Str[16]:String

Tapi jangan berharap output yang sama di semua versi JDK. saya sudah melihat satu bug yang ada di beberapa versi JDK di mana string null pertama telah diabaikan. Bug ini tidak ada dalam versi JDK terbaru, tetapi ada dalam beberapa versi antara JDK 1.7 versi akhir dan 1,8 versi awal.


12
2017-12-02 11:07