Apa perbedaan antara:
(.+?)
dan
(.*?)
kapan saya menggunakannya di php preg_match
regex saya ?
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 yanga(.+?)
,(.+?)b
,a(.+?)b
,a(.*?)
,(.*?)b
,a(.*?)b
..*
akan cocok sebanyak mungkin. Jika Anda ingin berhenti sedini mungkin, maka Anda harus membuatnya tidak.*?
Yang pertama (
+
) adalah satu atau lebih karakter . Yang kedua (*
) adalah nol atau lebih karakter . Keduanya tidak serakah (?
) dan cocok dengan apa pun (.
).sumber
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.sumber
+
cocok dengan setidaknya satu karakter*
cocok dengan sembarang angka (termasuk 0) karakterThe
?
menunjukkan ekspresi malas, sehingga akan cocok sebagai beberapa karakter mungkin.sumber
Pertimbangkan di bawah ini adalah string yang cocok.
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.+)
sumber
+
minimal satu,*
bisa nol juga.sumber
"+ is minimal one"
apa arti kalimat ini?Dalam RegEx,
{i,f}
artinya "antarai
untukf
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 4Sebagian 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
sumber
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.
sumber
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 keduanya5 and 15
. Perbedaannya adalah+
operator memerlukan setidaknya satu duplikat dari ekspresi regex sebelumnyasumber