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
Lepaskan: 2024-12-30 09:54:10
asal
344 orang telah melayarinya

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"']+|"([^"]*)"|'([^']*)'
Salin selepas log masuk

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());
    }
}
Salin selepas log masuk

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());
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan