The compile()
Metode selalu disebut di beberapa titik; itu satu-satunya cara untuk membuat objek Pola. Jadi pertanyaannya adalah, mengapa Anda harus menyebutnya secara eksplisit ? Salah satu alasannya adalah Anda memerlukan referensi ke objek Matcher sehingga Anda dapat menggunakan metodenya, seperti group(int)
mengambil konten dari grup penangkap. Satu-satunya cara untuk menguasai objek Matcher adalah melalui metode objek Pattern matcher()
, dan satu-satunya cara untuk menguasai objek Pattern adalah melalui compile()
metode. Lalu ada find()
metode yang, tidak seperti matches()
, tidak diduplikasi di kelas String atau Pola.
Alasan lainnya adalah untuk menghindari membuat objek Pattern yang sama berulang kali. Setiap kali Anda menggunakan salah satu metode bertenaga regex dalam String (atau matches()
metode statis dalam Pola), itu membuat Pola baru dan Pencocokan baru. Jadi cuplikan kode ini:
for (String s : myStringList) {
if ( s.matches("\\d+") ) {
doSomething();
}
}
... persis sama dengan ini:
for (String s : myStringList) {
if ( Pattern.compile("\\d+").matcher(s).matches() ) {
doSomething();
}
}
Jelas, itu melakukan banyak pekerjaan yang tidak perlu. Faktanya, perlu waktu lebih lama untuk mengompilasi regex dan membuat instance objek Pattern dengan mudah, daripada melakukan pencocokan sebenarnya. Jadi biasanya masuk akal untuk menarik langkah itu keluar dari lingkaran. Anda juga dapat membuat Matcher sebelumnya, meskipun harganya tidak terlalu mahal:
Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher("");
for (String s : myStringList) {
if ( m.reset(s).matches() ) {
doSomething();
}
}
Jika Anda terbiasa dengan regex .NET, Anda mungkin bertanya-tanya apakah compile()
metode Java terkait dengan RegexOptions.Compiled
pengubah .NET ; jawabannya adalah tidak. Pattern.compile()
Metode Java hanya setara dengan konstruktor Regex .NET. Saat Anda menentukan Compiled
opsi:
Regex r = new Regex(@"\d+", RegexOptions.Compiled);
... itu mengkompilasi regex langsung ke kode byte CIL, memungkinkannya untuk bekerja lebih cepat, tetapi dengan biaya yang signifikan dalam pemrosesan di muka dan penggunaan memori - anggap saja sebagai steroid untuk regex. Java tidak memiliki padanan; tidak ada perbedaan antara Pola yang dibuat di belakang layar oleh String#matches(String)
dan yang Anda buat secara eksplisit Pattern#compile(String)
.
(EDIT: Awalnya saya mengatakan bahwa semua objek .NET Regex di-cache, yang tidak benar. Sejak .NET 2.0, cache otomatis hanya terjadi dengan metode statis seperti Regex.Matches()
, bukan ketika Anda memanggil konstruktor Regex secara langsung. Ref )