Saya menemukan tutorial yang sangat baik ini pada ekspresi reguler dan sementara saya secara intuitif memahami apa yang "serakah", "segan" dan "posesif" lakukan, tampaknya ada lubang serius dalam pemahaman saya.
Secara khusus, dalam contoh berikut:
Enter your regex: .*foo // greedy quantifier
Enter input string to search: xfooxxxxxxfoo
I found the text "xfooxxxxxxfoo" starting at index 0 and ending at index 13.
Enter your regex: .*?foo // reluctant quantifier
Enter input string to search: xfooxxxxxxfoo
I found the text "xfoo" starting at index 0 and ending at index 4.
I found the text "xxxxxxfoo" starting at index 4 and ending at index 13.
Enter your regex: .*+foo // possessive quantifier
Enter input string to search: xfooxxxxxxfoo
No match found.
Penjelasan menyebutkan memakan seluruh string input, surat telah dikonsumsi , pencocokan mundur , kejadian "foo" paling kanan telah dimuntahkan , dll.
Sayangnya, terlepas dari metafora yang bagus, saya masih tidak mengerti apa yang dimakan oleh siapa ... Apakah Anda tahu tutorial lain yang menjelaskan (ringkas) bagaimana mesin ekspresi reguler bekerja?
Atau, jika seseorang dapat menjelaskan dalam frasa yang agak berbeda pada paragraf berikut, itu akan sangat dihargai:
Contoh pertama menggunakan quantifier serakah. * Untuk menemukan "apa pun", nol atau lebih kali, diikuti dengan huruf "f" "o" "o". Karena quantifier itu serakah, bagian. * Dari ekspresi pertama-tama memakan seluruh string input. Pada titik ini, ekspresi keseluruhan tidak dapat berhasil, karena tiga huruf terakhir ("f" "o" "o") telah dikonsumsi ( oleh siapa? ). Jadi pencocokan perlahan-lahan mundur ( dari kanan ke kiri? ) Satu huruf pada satu waktu sampai kemunculan paling kanan dari "foo" telah dimuntahkan ( apa artinya ini? ), Pada titik mana pertandingan berhasil dan pencarian berakhir.
Contoh kedua, bagaimanapun, adalah enggan, jadi itu dimulai dengan mengkonsumsi pertama ( oleh siapa? ) "Tidak ada". Karena "foo" tidak muncul di awal string, terpaksa menelan ( siapa yang menelan?) Huruf pertama ("x"), yang memicu kecocokan pertama pada 0 dan 4. Uji harness kami melanjutkan proses sampai string input habis. Ia menemukan kecocokan lain pada 4 dan 13.
Contoh ketiga gagal menemukan kecocokan karena kuantifier bersifat posesif. Dalam kasus ini, seluruh string input dikonsumsi oleh. * +, ( Bagaimana? ) Tidak menyisakan apa pun untuk memuaskan "foo" di akhir ekspresi. Gunakan quantifier posesif untuk situasi di mana Anda ingin merebut semua sesuatu tanpa pernah mundur ( apa artinya mundur? ); itu akan mengungguli quantifier serakah yang setara dalam kasus di mana pertandingan tidak segera ditemukan.
*
,+
dan?
yang serakah. Minimal bilangan suka*?
,+?
dan??
yang malas. Posesif bilangan suka*+
,++
dan?+
yang lengket.