Apa perbedaan antara:
(.+?)
dan
(.*?)
kapan saya menggunakannya di php preg_match
regex saya ?
Apa perbedaan antara:
(.+?)
dan
(.*?)
kapan saya menggunakannya di php preg_match
regex saya ?
Jawaban:
Mereka disebut bilangan.
*
0 atau lebih dari ekspresi sebelumnya
+
1 atau lebih dari ekspresi sebelumnya
Secara default, pembilang adalah serakah, yang berarti itu cocok dengan karakter sebanyak mungkin.
Itu ?
setelah quantifier sebuah perubahan perilaku untuk membuat quantifier ini "ungreedy", berarti itu akan cocok sesedikit mungkin.
Contoh serakah / ungreedy
Misalnya pada string " abab "
a.*b
akan cocok dengan "abab" (preg_match_all akan mengembalikan satu kecocokan, "abab")
sementara a.*?b
hanya akan cocok dengan "ab" awal (preg_match_all akan mengembalikan dua pertandingan, "ab")
Anda dapat menguji regex Anda secara online misalnya di Regexr, lihat contoh serakah di sini
(.+?)
dan (.*?)
berperilaku berbeda dalam berbagai posisi ekspresi reguler yang a(.+?)
, (.+?)b
, a(.+?)b
, a(.*?)
, (.*?)b
, a(.*?)b
.
.*
akan cocok sebanyak mungkin. Jika Anda ingin berhenti sedini mungkin, maka Anda harus membuatnya tidak .*?
A +
cocok dengan satu atau lebih contoh dari pola sebelumnya. A *
cocok dengan nol atau lebih contoh dari pola sebelumnya.
Jadi pada dasarnya, jika Anda menggunakan +
harus ada setidaknya satu contoh pola, jika Anda menggunakannya *
akan tetap cocok jika tidak ada contoh pola itu.
+
cocok dengan setidaknya satu karakter
*
cocok dengan sembarang angka (termasuk 0) karakter
The ?
menunjukkan ekspresi malas, sehingga akan cocok sebagai beberapa karakter mungkin.
Pertimbangkan di bawah ini adalah string yang cocok.
ab
Pola (ab.*)
akan mengembalikan kecocokan untuk kelompok tangkap dengan hasilab
Sedangkan polanya (ab.+)
tidak akan cocok dan tidak mengembalikan apapun.
Tetapi jika Anda mengubah string menjadi mengikuti, itu akan mengembalikan aba
pola(ab.+)
aba
Dalam RegEx, {i,f}
artinya "antara i
untuk f
mencocokkan". Mari kita lihat contoh berikut ini:
{3,7}
berarti antara 3 hingga 7 pertandingan {,10}
Berarti hingga 10 pertandingan tanpa batas bawah (yaitu batas bawah adalah 0){3,}
Berarti setidaknya 3 pertandingan tanpa batas atas (yaitu batas tertinggi adalah tak terbatas){,}
berarti tidak ada batas atas atau batas bawah untuk jumlah pertandingan (yaitu batas bawah adalah 0 dan batas atas adalah tak terhingga){5}
artinya tepat 4 Sebagian besar bahasa yang bagus berisi singkatan, begitu pula RegEx:
+
adalah singkatan dari {1,}
*
adalah singkatan dari {,}
?
adalah singkatan dari {,1}
Ini berarti +
membutuhkan setidaknya 1 pertandingan saat *
menerima sejumlah pertandingan atau tidak ada pertandingan sama sekali dan?
menerima tidak lebih dari 1 pertandingan atau nol pertandingan.
Kredit: Codecademy.com
Bintang sangat mirip dengan plus, satu-satunya perbedaan adalah bahwa meskipun plus cocok dengan 1 atau lebih karakter / grup sebelumnya, bintang tersebut cocok dengan 0 atau lebih.
Saya pikir jawaban sebelumnya gagal menyoroti contoh sederhana:
misalnya kami memiliki array:
numbers = [5, 15]
Ekspresi regex berikut ^[0-9]+
cocok: 15
hanya. Namun, ^[0-9]*
cocokkan keduanya 5 and 15
. Perbedaannya adalah +
operator memerlukan setidaknya satu duplikat dari ekspresi regex sebelumnya