API Java untuk ekspresi reguler menyatakan yang \s
akan cocok dengan spasi. Jadi regex \\s\\s
harus cocok dengan dua spasi.
Pattern whitespace = Pattern.compile("\\s\\s");
matcher = whitespace.matcher(modLine);
while (matcher.find()) matcher.replaceAll(" ");
Tujuannya adalah untuk mengganti semua contoh dari dua spasi berurutan dengan satu spasi. Namun ini sebenarnya tidak berhasil.
Apakah saya mengalami kesalahpahaman yang parah tentang ekspresi reguler atau istilah "spasi"?
"abc \xA0 def \x85 xyz"
untuk melihat apa yang saya maksud: hanya ada tiga bidang di sana.Jawaban:
Ya, Anda perlu mengambil hasil dari
matcher.replaceAll()
:sumber
Anda tidak dapat menggunakan
\s
di Java untuk mencocokkan spasi putih pada kumpulan karakter aslinya sendiri, karena Java tidak mendukung properti spasi kosong Unicode - meskipun hal itu benar-benar diperlukan untuk memenuhi RL1.2 UTS # 18! Apa yang dimilikinya tidak sesuai standar, sayangnya.Unicode mendefinisikan 26 poin kode sebagai
\p{White_Space}
: 20 di antaranya adalah berbagai macam\pZ
GeneralCategory = Separator , dan 6 sisanya adalah\p{Cc}
GeneralCategory = Control .Ruang putih adalah properti yang cukup stabil, dan yang sama telah ada hampir selamanya. Meski begitu, Java tidak memiliki properti yang sesuai dengan The Unicode Standard untuk ini, jadi Anda harus menggunakan kode seperti ini:
Sekarang Anda dapat menggunakan
whitespace_charclass + "+"
sebagai pola di filereplaceAll
.Maaf tentang semua itu. Regex Java tidak bekerja dengan baik pada kumpulan karakter aslinya, jadi Anda benar-benar harus melewati rintangan eksotis untuk membuatnya berfungsi.
Dan jika menurut Anda ruang kosong itu buruk, Anda harus melihat apa yang harus Anda lakukan untuk mendapatkan
\w
dan\b
akhirnya berperilaku dengan benar!Ya, itu mungkin, dan ya, ini adalah kekacauan yang mencengangkan. Itu bahkan beramal. Cara termudah untuk mendapatkan perpustakaan regex yang sesuai standar untuk Java adalah dengan JNI ke barang-barang ICU. Itulah yang dilakukan Google untuk Android, karena OraSun tidak sesuai.
Jika Anda tidak ingin melakukan itu tetapi masih ingin tetap menggunakan Java, saya memiliki pustaka penulisan ulang regex front-end. Saya menulis bahwa "memperbaiki" pola Java, setidaknya agar sesuai dengan persyaratan RL1.2a di UTS # 18, Unicode Regular Expressions .
sumber
Untuk Java (bukan php, bukan javascript, tidak lainnya):
sumber
ketika saya mengirim pertanyaan ke forum Regexbuddy (aplikasi pengembang regex), saya mendapat jawaban yang lebih tepat untuk pertanyaan Java saya:
"Penulis pesan: Jan Goyvaerts
Di Java, singkatan \ s, \ d, dan \ w hanya menyertakan karakter ASCII. ... Ini bukan bug di Java, tetapi hanya salah satu dari banyak hal yang perlu Anda waspadai saat bekerja dengan ekspresi reguler. Untuk mencocokkan semua spasi kosong Unicode serta jeda baris, Anda dapat menggunakan [\ s \ p {Z}] di Java. RegexBuddy belum mendukung properti khusus Java seperti \ p {javaSpaceChar} (yang cocok dengan karakter yang sama persis dengan [\ s \ p {Z}]).
... \ s \ s akan cocok dengan dua spasi, jika inputnya hanya ASCII. Masalah sebenarnya adalah dengan kode OP, seperti yang ditunjukkan oleh jawaban yang diterima dalam pertanyaan itu. "
sumber
[\s\p{z}]
menghilangkan karakter Unicode "baris berikutnya" U + 0085. Gunakan[\s\u0085\p{Z}]
.Sepertinya berhasil untuk saya:
akan mencetak:
Saya pikir Anda bermaksud melakukan ini alih-alih kode Anda:
sumber
Untuk tujuan Anda, Anda dapat menggunakan snnippet ini:
Ini akan menormalkan jarak menjadi tunggal dan akan menghapus spasi putih awal dan akhir juga.
sumber
sumber
Java telah berkembang sejak masalah ini pertama kali diangkat. Anda dapat mencocokkan semua jenis karakter spasi unicode dengan menggunakan
\p{Zs}
grup.Jadi, jika Anda ingin mengganti satu atau lebih ruang eksotis dengan ruang polos, Anda dapat melakukan ini:
Juga layak mengetahui, jika Anda telah menggunakan
trim()
fungsi string yang Anda harus melihat pada (relatif baru)strip()
,stripLeading()
danstripTrailing()
fungsi pada string. Dapat membantu Anda memangkas semua jenis karakter spasi kosong. Untuk informasi lebih lanjut tentang apa yang disertakan, lihatCharacter.isWhitespace()
fungsi Java .sumber
Penggunaan spasi di RE memang menyebalkan, tapi saya yakin itu berhasil. Masalah OP juga dapat diselesaikan menggunakan StringTokenizer atau metode split (). Namun, untuk menggunakan RE (hapus tanda komentar println () untuk melihat bagaimana matcher memecah String), berikut ini contoh kode:
Ini menghasilkan yang berikut (kompilasi dengan javac dan jalankan pada prompt perintah):
% java Two21WS Awal: "ab cdef gh ij kl" Two21WS: "ab cdef gh ij kl"
sumber
replaceAll()
saja?