Saya mencoba memahami blok kode ini. Yang pertama, apa yang kita cari dalam ekspresi?
Pemahaman saya adalah bahwa itu karakter apa saja (0 atau lebih kali *) diikuti oleh angka antara 0 dan 9 (satu atau lebih kali +) diikuti oleh karakter apa saja (0 atau lebih kali *).
Ketika ini dijalankan hasilnya adalah:
Found value: This order was placed for QT3000! OK?
Found value: This order was placed for QT300
Found value: 0
Bisakah seseorang tolong melalui ini dengan saya?
Apa keuntungan menggunakan kelompok Menangkap?
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexTut3 {
public static void main(String args[]) {
String line = "This order was placed for QT3000! OK?";
String pattern = "(.*)(\\d+)(.*)";
// Create a Pattern object
Pattern r = Pattern.compile(pattern);
// Now create matcher object.
Matcher m = r.matcher(line);
if (m.find()) {
System.out.println("Found value: " + m.group(0));
System.out.println("Found value: " + m.group(1));
System.out.println("Found value: " + m.group(2));
} else {
System.out.println("NO MATCH");
}
}
}
Jawaban:
Masalah yang Anda hadapi adalah dengan tipe quantifier. Anda menggunakan quantifier rakus di grup pertama Anda (indeks 1 - indeks 0 mewakili keseluruhan
Pattern
), yang berarti akan cocok sebanyak mungkin (dan karena itu karakter apa pun , itu akan cocok dengan karakter sebanyak yang ada untuk memenuhi kondisi untuk kelompok selanjutnya).Singkatnya, grup pertama Anda
.*
cocok dengan apa saja selama grup berikutnya\\d+
dapat mencocokkan sesuatu (dalam hal ini, digit terakhir).Sesuai grup ke-3, itu akan cocok dengan apa pun setelah digit terakhir.
Jika Anda mengubahnya ke kuantifier enggan di grup 1 Anda, Anda akan mendapatkan hasil yang saya kira Anda harapkan, yaitu, bagian 3000 .
Catat tanda tanya di grup 1.
Keluaran:
Info lebih lanjut tentang Java di
Pattern
sini .Akhirnya, grup penangkap dibatasi oleh kurung bundar, dan menyediakan cara yang sangat berguna untuk menggunakan referensi-balik (di antara hal-hal lain), setelah Anda
Pattern
dicocokkan dengan input.Di Java 6 grup hanya dapat direferensikan oleh pesanan mereka (waspadalah terhadap kelompok yang bersarang dan kehalusan memesan).
Di Java 7 itu jauh lebih mudah, karena Anda dapat menggunakan grup bernama.
sumber
named-regexp
.Ini sepenuhnya oke.
m.group(0)
) selalu menangkap seluruh area yang dicakup oleh ekspresi reguler Anda . Dalam hal ini, seluruh string.(.*)(\\d+)
( Bagian pertama regex Anda) mencakup...QT300
int grup pertama dan0
yang kedua.(.*)
ke(.*?)
.Untuk info lebih lanjut tentang rakus vs malas, lihat situs ini.
sumber
Dari dokumen:
Jadi, tangkap grup 0 kirim seluruh baris.
sumber
Pemahaman Anda benar. Namun, jika kita berjalan melalui:
(.*)
akan menelan seluruh string;(\\d+)
satistif (yang mengapa0
ditangkap, dan bukan3000
);(.*)
akan menangkap sisanya.Namun, saya tidak yakin apa maksud asli si penulis.
sumber