Rumah >Java >javaTutorial >Bagaimana untuk Memisahkan Rentetan mengikut Ruang Semasa Mengekalkan Segmen Dipetik Menggunakan Ungkapan Biasa?

Bagaimana untuk Memisahkan Rentetan mengikut Ruang Semasa Mengekalkan Segmen Dipetik Menggunakan Ungkapan Biasa?

Linda Hamilton
Linda Hamiltonasal
2024-12-30 09:54:10346semak imbas

How to Split Strings by Spaces While Preserving Quoted Segments Using Regular Expressions?

Memisahkan Rentetan dengan Ruang Tidak Termasuk Segmen Dipetik

Dalam bidang ungkapan biasa, tugas membelah rentetan pada ruang sambil mengekalkan segmen yang disebut boleh menakutkan pengguna baru. Untuk menangani cabaran ini, kami mencari penyelesaian yang mantap yang memisahkan rentetan input kami dengan tepat kepada elemen konstituennya.

Rentetan contoh yang disediakan membentangkan kes khusus di mana ruang menyempadankan perkataan, tetapi tidak dalam segmen petikan tunggal atau dua kali. Output yang diingini mengekalkan segmen yang disebut ini, memastikan frasa seperti "akan" atau 'ungkapan biasa' kekal utuh.

Ungkapan biasa yang sesuai untuk tugasan ini adalah sangat mudah:

[^\s"']+|"([^"]*)"|'([^']*)'

Memecahkan ungkapan ini:

  • [^s"'] : Memadankan urutan aksara yang bukan ruang, petikan atau petikan tunggal.
  • "([^"]*)": Memadankan rentetan petikan dua kali, menangkap kandungan dalam kumpulan penangkapan kedua.
  • ' ([^']*)': Memadankan rentetan petikan tunggal, menangkap kandungan dalam tangkapan ketiga kumpulan.

Untuk menggunakan ungkapan ini dalam Java, kami boleh menggunakan kod berikut:

List<String> matchList = new ArrayList<>();
Pattern regex = Pattern.compile("[^\s\"']+|\"([^\"]*)\"|'([^']*)'");
Matcher regexMatcher = regex.matcher(subjectString);
while (regexMatcher.find()) {
    if (regexMatcher.group(1) != null) {
        // Add double-quoted string without the quotes
        matchList.add(regexMatcher.group(1));
    } else if (regexMatcher.group(2) != null) {
        // Add single-quoted string without the quotes
        matchList.add(regexMatcher.group(2));
    } else {
        // Add unquoted word
        matchList.add(regexMatcher.group());
    }
}

Kod ini berulang pada rentetan input, menangkap segmen yang disebut dan tidak disebut, menghasilkan senarai elemen pecahan. Sebagai alternatif, kita boleh menggunakan versi yang lebih ringkas:

List<String> matchList = new ArrayList<>();
Pattern regex = Pattern.compile("[^\s\"']+|\"[^\"]*\"|'[^']*'");
Matcher regexMatcher = regex.matcher(subjectString);
while (regexMatcher.find()) {
    matchList.add(regexMatcher.group());
}

Versi yang dipermudahkan ini termasuk elemen yang disebut dan tidak disebut dalam senarai.

Atas ialah kandungan terperinci Bagaimana untuk Memisahkan Rentetan mengikut Ruang Semasa Mengekalkan Segmen Dipetik Menggunakan Ungkapan Biasa?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn