Apakah Java memiliki cara bawaan untuk keluar dari teks arbitrer sehingga dapat dimasukkan dalam ekspresi reguler? Misalnya, jika pengguna saya memasukkan "$ 5", saya ingin mencocokkannya dengan tepat daripada "5" setelah akhir input.
320
\Q
dan\E
. Ini dapat menyebabkan hasil yang tidak terduga, misalnyaPattern.quote("*.wav").replaceAll("*",".*")
akan menghasilkan\Q.*.wav\E
dan tidak.*\.wav
, seperti yang Anda harapkan."mouse".toUpperCase().replaceAll("OUS","ic")
akan kembaliMicE
. Anda would't berharap untuk kembaliMICE
karena Anda tidak berlakutoUpperCase()
padaic
. Dalam contoh sayaquote()
diterapkan pada.*
insertetreplaceAll()
juga. Anda harus melakukan sesuatu yang lain, mungkin.replaceAll("*","\\E.*\\Q")
akan berhasil, tetapi itu berlawanan dengan intuisi.*.wav
menjadi pola regex\*\.wav
, dan ganti Semua akan mengubahnya menjadi\.*\.wav
, berarti itu akan mencocokkan file yang namanya terdiri dari jumlah periode acak diikuti oleh.wav
. Anda kemungkinan besar harus melakukannyareplaceAll("\\*", ".*")
jika mereka pergi dengan implementasi yang lebih rapuh yang bergantung pada mengenali semua charachters regex aktif yang mungkin dan melarikan diri secara individual ... apakah itu jauh lebih mudah?Perbedaan antara
Pattern.quote
danMatcher.quoteReplacement
tidak jelas bagi saya sebelum saya melihat contoh berikutsumber
Pattern.quote
mengganti karakter khusus dalam string pencarian regex, seperti. | + () Dll, danMatcher.quoteReplacement
menggantikan karakter khusus dalam string pengganti, seperti \ 1 untuk referensi-ulang.quoteReplacement
hanya peduli pada dua simbol$
dan\
yang misalnya dapat digunakan dalam string pengganti sebagai backreferences$1
atau\1
. Karena itu tidak boleh digunakan untuk melarikan diri / mengutip suatu regex.$Group$
denganT$UYO$HI
. The$
simbol khusus baik dalam pola dan penggantian:"$Group$ Members".replaceFirst(Pattern.quote("$Group$"), Matcher.quoteReplacement("T$UYO$HI"))
Mungkin sudah terlambat untuk merespons, tetapi Anda juga dapat menggunakan
Pattern.LITERAL
, yang akan mengabaikan semua karakter khusus saat memformat:sumber
Pattern.CASE_INSENSITIVE
Saya pikir apa yang Anda cari
\Q$5\E
. Lihat jugaPattern.quote(s)
diperkenalkan di Java5.Lihat Pola javadoc untuk detailnya.
sumber
Pertama, jika
itu tidak akan menempatkan 1 di akhir. Ini akan melihat regex pencarian untuk grup yang cocok pertama dan sub ITULAH. Itu artinya $ 1, $ 2 atau $ 3 berarti dalam teks pengganti: kelompok yang cocok dari pola pencarian.
Saya sering menyambungkan string panjang teks ke file .properties, lalu menghasilkan subjek dan badan email dari mereka. Memang, ini tampaknya menjadi cara standar untuk melakukan i18n di Spring Framework. Saya menempatkan tag XML, sebagai placeholder, ke dalam string dan saya menggunakan replaceAll () untuk mengganti tag XML dengan nilai-nilai saat runtime.
Saya mengalami masalah ketika pengguna memasukkan angka dolar, dengan tanda dolar. replaceAll () tersedak karenanya, dengan yang berikut ini muncul di stracktrace:
Dalam hal ini, pengguna telah memasukkan "$ 3" di suatu tempat di input mereka dan replaceAll () pergi mencari di regex pencarian untuk kelompok yang cocok ketiga, tidak menemukan satu, dan muntah.
Diberikan:
mengganti
dengan
memecahkan masalah. Pengguna dapat memasukkan karakter apa pun, termasuk tanda dolar, tanpa masalah. Itu berperilaku persis seperti yang Anda harapkan.
sumber
Untuk memiliki pola yang dilindungi, Anda dapat mengganti semua simbol dengan "\\", kecuali angka dan huruf. Dan setelah itu Anda dapat menempatkan dalam pola yang dilindungi itu simbol khusus Anda untuk membuat pola ini bekerja tidak seperti teks yang dikutip bodoh, tetapi benar-benar seperti patten, tetapi Anda sendiri. Tanpa simbol khusus pengguna.
sumber
Pattern.quote ("blabla") berfungsi dengan baik.
Pattern.quote () berfungsi dengan baik. Itu melampirkan kalimat dengan karakter " \ Q " dan " \ E ", dan jika itu lolos "\ Q" dan "\ E". Namun, jika Anda perlu melakukan pelarian ekspresi reguler yang sebenarnya (atau pelolosan khusus), Anda dapat menggunakan kode ini:
Metode ini mengembalikan: Some / \ s / wText * / \, **
Contoh kode dan tes:
sumber
Simbol ^ (Negasi) digunakan untuk mencocokkan sesuatu yang tidak ada dalam grup karakter.
Ini tautan ke Ekspresi Reguler
Ini adalah info gambar tentang negasi:
sumber