Perbedaan Regex Plus vs Star?


90

Apa perbedaan antara:

(.+?)

dan

(.*?)

kapan saya menggunakannya di php preg_matchregex saya ?

Jawaban:


150

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.*?bhanya 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


2
"malas" adalah istilah yang lebih umum untuk "ungreedy"
Walter Tross

Contohnya salah. Kedua (.+?)dan (.*?)berperilaku berbeda dalam berbagai posisi ekspresi reguler yang a(.+?), (.+?)b, a(.+?)b, a(.*?), (.*?)b, a(.*?)b.
Louis55

Mengapa a. * B tidak mengembalikan "ab"? Bukankah itu mengatakan "kata yang memiliki antara a dan b, 0 atau lebih karakter", oleh karena itu, ab memiliki karakter nol antara dan bisa jadi cocok. Mengapa ini salah?
Hello World

@HelloWorld, ini ada hubungannya dengan keserakahan yang saya jelaskan di atas. .*akan cocok sebanyak mungkin. Jika Anda ingin berhenti sedini mungkin, maka Anda harus membuatnya tidak .*?
berbahaya

22

Yang pertama ( +) adalah satu atau lebih karakter . Yang kedua ( *) adalah nol atau lebih karakter . Keduanya tidak serakah ( ?) dan cocok dengan apa pun ( .).


1
Itu tergantung pada apakah pengubah s disetel atau tidak.
Quentin

8

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.


8

+ cocok dengan setidaknya satu karakter

* cocok dengan sembarang angka (termasuk 0) karakter

The ?menunjukkan ekspresi malas, sehingga akan cocok sebagai beberapa karakter mungkin.


8

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 abapola(ab.+)

aba

Saya pikir ini adalah jawaban yang lebih baik khusus untuk pertanyaan + vs *
Terrence


5

Dalam RegEx, {i,f}artinya "antara iuntuk fmencocokkan". 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


4

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.


2

Saya pikir jawaban sebelumnya gagal menyoroti contoh sederhana:

misalnya kami memiliki array:

numbers = [5, 15]

Ekspresi regex berikut ^[0-9]+cocok: 15hanya. Namun, ^[0-9]*cocokkan keduanya 5 and 15. Perbedaannya adalah +operator memerlukan setidaknya satu duplikat dari ekspresi regex sebelumnya

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.