Peran karakter “backslash” pada regular expression di Java
Hari ini, giliran ngulik Java.
Ceritanya, beberapa hari lalu saya memutuskan untuk menyimpan pengetahuan mengenai format suatu file teks melalui pola regex di SQLite. Pada saat uji coba, saya memasukkan karakter pola regex langsung ke class Pattern. Contohnya adalah potongan code berikut ini.
Pattern c = Pattern.compile(" [a-zA-Z][\\s]+[0-9]+[\\s]+[0-9]+[-][\\s]+[0-9]+[\\s]+[0-9]+[.][0-9]+[\\s]+[0-9]+[.][0-9]+[\\s]+[0-9]+[.][0-9]+[E][+][0-9]+[\\s]+[0-9]+[.][0-9]+[\\s]+[0-9]+[.][0-9]+[E][+][0-9]+[\\s]+[A-Z]+[-][0-9]+.*");[Code 0]
Karena dengan cara serupa pendeteksian format file teks berjalan lancar, karakter regex tersebut saya simpan apa adanya ke dalam SQLite untuk kemudian saya query dan lakukan pattern matching. Hasilnya, tidak ada baris teks dalam file yang sesuai dengan karakter pattern yang saya simpan di SQLite. Aneh, padahal jika dilakukan dengan cara sederhana seperti potongan code di atas berhasil.
Akhirnya, setelah lama penasaran akhirnya masalahnya ketemu. Saya tidak menyangka, ketika saya minta karakter regex dicetak langsung ke layar, satu karakter “backslash” (\) pada penanda whitespace hilang, sehingga pola regexnya menjadi seperti berikut.
[a-zA-Z][\s]+[0-9]+[\s]+[0-9]+[-][\s]+[0-9]+[\s]+[0-9]+[.][0-9]+[\s]+[0-9]+[.][0-9]+[\s]+[0-9]+[.][0-9]+[E][+][0-9]+[\s]+[0-9]+[.][0-9]+[\s]+[0-9]+[.][0-9]+[E][+][0-9]+[\s]+[A-Z]+[-][0-9]+.* . [Code 1]
Alasannya, berdasarkan dokumentasi JDK (dapat diperoleh dengan jelas di sini), representasi karakter untuk regex memerlukan escape character dalam bentuk karakter “backslash” ganda. Ketika disimpan sebagai variabel String, maka escape character tadi diabaikan. Detilnya perlu saya pelajari lebih lanjut nih, Insya Allah di tulisan-tulisan berikutnya. Karenanya, pola regex yang saya simpan dalam SQLite berupa variable String menjadi tidak cocok lagi.
Solusinya, pola regex yang saya simpan pada SQLite harus mengikuti pola seperti pada [Code 1]. Alhamdulillah, tambah lagi yang saya tahu hari ini.