Bagaimana cara memberi tahu RegEx (versi .NET) untuk mendapatkan kecocokan valid terkecil, bukan yang terbesar?
Bagaimana cara memberi tahu RegEx (versi .NET) untuk mendapatkan kecocokan valid terkecil, bukan yang terbesar?
Jawaban:
Untuk ekspresi reguler seperti .*
atau .+
, tambahkan tanda tanya ( .*?
atau .+?
) untuk mencocokkan karakter sesedikit mungkin. Untuk mencocokkan bagian secara opsional (?:blah)?
tetapi tanpa pencocokan kecuali benar-benar diperlukan, gunakan sesuatu seperti (?:blah){0,1}?
. Untuk pertandingan berulang (baik menggunakan {n,}
atau {n,m}
sintaks) tambahkan tanda tanya untuk mencoba mencocokkan sesedikit mungkin (misalnya {3,}?
atau {5,7}?
).
Dokumentasi tentang bilangan ekspresi reguler juga dapat membantu.
Operator yang tidak serakah ?
,. Seperti:
.*?
Operator non serakah tidak berarti pertandingan yang sesingkat mungkin:
abcabk.dll
a.+?k
akan cocok dengan seluruh string (dalam contoh ini), bukan hanya tiga tanda terakhir.
Saya ingin benar-benar menemukan kecocokan sekecil mungkin.
Itu adalah kemungkinan kecocokan terakhir untuk ' a
' untuk tetap mengizinkan semua kecocokan k
.
Saya kira satu-satunya cara untuk melakukannya adalah dengan menggunakan ekspresi seperti:
a[^a]+?k
cab
. Jika masukan saya caaacab
dan saya mencarinya a.*?b
akan mengembalikan string lengkap, bukan kecocokan pendek di dalamnya. Bagaimana saya menelusuri mundur dari b
?
START[^START]*?END
(START dan END adalah regex karakter awal dan akhir Anda). Ini pada dasarnya berarti "mencocokkan apa pun dari MULAI hingga AKHIR di mana karakter di antara tidak menyertakan MULAI lagi"
abcabk
dana.+?k
, RegEx akan mencocokkan seluruh string.