Jika saya menjalankan ini:
/([^\/]+)+/g.exec('/a/b/c/d');
Saya mengerti ini:
["a", "a"]
Tetapi jika saya menjalankan ini:
'/a/b/c/d'.match(/([^\/]+)+/g);
Kemudian saya mendapatkan hasil yang diharapkan dari ini:
["a", "b", "c", "d"]
Apa bedanya?
javascript
regex
Justin Warkentin
sumber
sumber
exec
untuk mendapatkan semua sub-pilihan.+
tidak diperlukan karenamatch
akan mengembalikan semua sub-ekspresi..exec
hanya mengembalikan satu setiap kali, jadi tidak perlu itu+
juga.Jawaban:
exec
dengan ekspresi reguler global dimaksudkan untuk digunakan dalam loop, karena masih akan mengambil semua subekspresi yang cocok. Begitu:String.match
melakukan ini untuk Anda dan membuang grup yang ditangkap.sumber
while(match = /[^\/]+/g.exec('/a/b/c/d')
atau itu akan membuat pengulangan tak terbatas !. Seperti yang dinyatakan dengan jelas di MDN developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…new RegExp("pattern")
dan/pattern/
berarti hal yang berbeda.Satu gambar lebih baik, Anda tahu ...
Lihat perbedaannya?
sumber
/regex/.exec()
mengembalikan hanya kecocokan pertama yang ditemukan, sementara"string".match()
mengembalikan semuanya jika Anda menggunakang
flag di regex.Lihat di sini: exec , match .
sumber
Jika regex Anda bersifat global, dan Anda menangkapnya, Anda harus menggunakan exec. Pertandingan tidak akan mengembalikan semua tangkapan Anda.
Cocok bekerja sangat baik saat hanya mencocokkan (tidak menangkap). Anda menjalankannya sekali dan itu memberikan array dari semua pertandingan. (meskipun jika regex tidak global, maka pertandingan akan menunjukkan kecocokan diikuti dengan tangkapan)
Exec adalah apa yang Anda gunakan saat Anda menangkap, dan setiap kali dijalankan itu memberikan kecocokan, diikuti oleh tangkapan. (kecocokan akan berperilaku dengan cara memberikan kecocokan lengkap diikuti dengan tangkapan, hanya jika regex tidak global).
Penggunaan lain dengan Exec, mendapatkan indeks atau posisi, dari suatu kecocokan. Jika Anda memiliki variabel untuk regex Anda, Anda dapat menggunakan .lastIndex dan mendapatkan posisi yang cocok. Objek regex memiliki .lastIndex, dan objek regex adalah tempat Anda melakukan .exec. Pencocokan titik dilakukan pada sebuah string dan Anda tidak akan dapat melakukan objek regex dot lastIndex
Sebuah string, memiliki fungsi match, yang diberikan regex. Dan regex, memiliki fungsi exec, dan mengirimkan string
exec Anda menjalankan beberapa kali. pertandingan yang Anda jalankan sekali
Sebaiknya gunakan kecocokan saat tidak menangkap dan saat menangkap Anda bisa menggunakan exec yang lebih kuat karena bagus untuk menangkap, tetapi jika Anda memang menggunakan kecocokan saat menangkap, lihat bahwa itu menunjukkan penangkapan saat regex tidak global, tetapi tidak. t show menangkap saat regex bersifat global.
Hal lainnya adalah jika Anda menggunakan exec, catatan yang dipanggil di regex, maka jika Anda menggunakan variabel untuk regex, Anda memiliki lebih banyak kekuatan.
Anda tidak mendapatkan kecocokan saat Anda tidak menggunakan variabel untuk regex, jadi gunakan variabel untuk regex, saat menggunakan exec.
Dan dengan exec, Anda bisa mendapatkan "indeks" dari pertandingan tersebut
Jadi, jika Anda ingin mengindeks atau menangkap, maka gunakan exec (ingatlah bahwa seperti yang Anda lihat, dengan "indeks", "indeks" yang diberikannya benar-benar kejadian ke-n, dihitung dari 1. Jadi Anda bisa mendapatkan yang tepat indeks dengan mengurangi 1. Dan seperti yang Anda lihat, ini memberikan 0 - Indeks terakhir 0 - untuk tidak ditemukan).
Dan jika Anda ingin merentangkan pencocokan, Anda dapat menggunakannya saat menangkap, tetapi tidak saat regex bersifat global, dan saat Anda melakukannya untuk itu, maka konten larik tidak semuanya cocok, tetapi penuh. pertandingan diikuti dengan penangkapan.
sumber
r.lastIndex
adalah faktor kunci untuk memahami perbedaan antaraexec
danmatch
.If your regex is global, and you are capturing, then you must use exec. Match won't return all your captures.
Saya mendapatkannya di konsol. Cukup salin / tempel"a,b,c,aa,bb,cc".match(/(\w+)/g);
Opera, Firefox."a,b,c,aa,bb,cc".match(/(\w+)/g)
Apa yang terjadi di sana itu menunjukkan semua pertandingan, dan kebetulan Anda menangkap setiap pertandingan, jadi jika itu menunjukkan semua tangkapan, itu akan terlihat persis sama (cntd)The .match () fungsi
str.match(regexp)
akan melakukan hal berikut:g
bendera yang digunakan di regexp: itu akan mengembalikan semua substring (mengabaikan kelompok capture)g
flag tidak digunakan di regexp: ini akan mengembalikan sama sepertiregexp.exec(str)
null
Contoh .match () yang menggunakan
g
flag:Dan .match () tanpa
g
flag sama dengan .exec () :The .exec () fungsi
regexp.exec(str)
akan melakukan hal berikut:g
bendera yang digunakan di regexp: itu akan kembali (untuk setiap kali hal itu disebut) :[N_MatchedStr, N_Captured1, N_Captured2, ...]
dari berikutnyaN
pertandingan. Penting: itu tidak akan maju ke kecocokan berikutnya jika objek regexp tidak disimpan dalam variabel (harus objek yang sama)g
flag tidak digunakan dalam regexp: ia akan mengembalikan sama seperti jikag
flag memiliki flag dan dipanggil untuk pertama kali dan hanya sekali.null
Contoh .exec () (regexp + disimpan menggunakan
g
flag = itu berubah dengan setiap panggilan):Contoh .exec () ketika tidak berubah dengan setiap panggilan:
sumber
Terkadang regex.exec () membutuhkan lebih banyak waktu dibandingkan string.match ().
Perlu disebutkan bahwa jika hasil dari string.match () dan regex.exec () sama (contoh: saat tidak menggunakan \ g flag), regex.exec () akan mengambil tempat antara x2 hingga x30 lalu string. pertandingan():
Oleh karena itu, dalam kasus seperti itu, menggunakan pendekatan "new RegExp (). Exec ()" harus digunakan hanya saat Anda membutuhkan regex global (yaitu untuk mengeksekusi lebih dari sekali).
sumber