Saya mencoba untuk menguraikan string url-encoded yang terdiri dari pasangan kunci = nilai yang dipisahkan oleh salah satu &
atau &
.
Berikut ini hanya akan cocok dengan kejadian pertama, memecah kunci dan nilai menjadi elemen hasil yang terpisah:
var result = mystring.match(/(?:&|&)?([^=]+)=([^&]+)/)
Hasil untuk string '1111342 = Adam% 20Franco & 348572 = Bob% 20Jones' adalah:
['1111342', 'Adam%20Franco']
Menggunakan flag global, 'g', akan cocok dengan semua kejadian, tetapi hanya mengembalikan sub-string yang sepenuhnya cocok, bukan kunci dan nilai yang dipisahkan:
var result = mystring.match(/(?:&|&)?([^=]+)=([^&]+)/g)
Hasil untuk string '1111342 = Adam% 20Franco & 348572 = Bob% 20Jones' adalah:
['1111342=Adam%20Franco', '&348572=Bob%20Jones']
Sementara saya dapat memisahkan string &
dan memecah setiap pasangan kunci / nilai secara terpisah, apakah ada cara menggunakan dukungan ekspresi reguler JavaScript untuk mencocokkan beberapa kemunculan pola yang /(?:&|&)?([^=]+)=([^&]+)/
mirip dengan preg_match_all()
fungsi PHP ?
Saya bertujuan untuk beberapa cara untuk mendapatkan hasil dengan sub-pertandingan terpisah seperti:
[['1111342', '348572'], ['Adam%20Franco', 'Bob%20Jones']]
atau
[['1111342', 'Adam%20Franco'], ['348572', 'Bob%20Jones']]
sumber
replace
sini.var data = {}; mystring.replace(/(?:&|&)?([^=]+)=([^&]+)/g, function(a,b,c,d) { data[c] = d; });
selesai "matchAll" dalam JavaScript adalah "replace" dengan fungsi handler pengganti, bukan string.Jawaban:
Diangkat dari komentar
Dukungan peramban tercantum di sini https://caniuse.com/#feat=urlsearchparams
Saya akan menyarankan regex alternatif, menggunakan sub-kelompok untuk menangkap nama dan nilai parameter secara individual dan
re.exec()
:result
adalah sebuah objek:Regex terurai sebagai berikut:
sumber
x = y
akan menugaskany
untukx
dan juga memproduksiy
). Ketika kami menerapkan pengetahuan itu untukif (match = re.exec(url))
: Ini A) melakukan tugas dan B) mengembalikan hasilre.exec(url)
kewhile
. Sekarangre.exec
kembalinull
jika tidak ada kecocokan, yang merupakan nilai palsu. Jadi efeknya loop akan berlanjut selama ada kecocokan.Anda perlu menggunakan sakelar 'g' untuk pencarian global
sumber
Sunting tahun 2020
Gunakan URLSearchParams , karena pekerjaan ini tidak lagi memerlukan segala jenis kode khusus. Browser dapat melakukan ini untuk Anda dengan konstruktor tunggal:
hasil panen
Jadi tidak ada alasan untuk menggunakan regex untuk ini lagi.
Jawaban asli
Jika Anda tidak ingin bergantung pada "pencocokan buta" yang datang dengan
exec
pencocokan gaya berjalan , JavaScript memang datang dengan fungsi yang cocok dengan semua yang ada di dalamnya, tetapi itu adalah bagian darireplace
panggilan fungsi, saat menggunakan "apa yang harus dilakukan dengan tangkapan fungsi penanganan " :selesai
Alih-alih menggunakan fungsi penanganan grup tangkap untuk benar-benar mengembalikan string pengganti (untuk penanganan penggantian, argumen pertama adalah kecocokan pola penuh, dan argumen berikutnya adalah grup tangkapan individu), kami hanya mengambil tangkapan grup 2 dan 3, dan cache yang berpasangan.
Jadi, daripada menulis fungsi parsing yang rumit, ingatlah bahwa fungsi "matchAll" dalam JavaScript hanyalah "ganti" dengan fungsi handler pengganti, dan banyak efisiensi pencocokan pola dapat diperoleh.
sumber
something "this one" and "that one"
. Saya ingin menempatkan semua string yang dikutip ganda dalam daftar yaitu [yang ini, yang itu]. Sejauh inimystring.match(/"(.*?)"/)
berfungsi dengan baik dalam mendeteksi yang pertama, tapi saya tidak tahu bagaimana mengadaptasi solusi Anda untuk satu kelompok penangkapan tunggal.Untuk mengambil grup, saya terbiasa menggunakan
preg_match_all
PHP dan saya sudah mencoba mereplikasi fungsinya di sini:sumber
/g
menjalankan yang lainexec()
tidak akan mengubah indeks saat ini dan akan mengulang selamanya.Tetapkan
g
pengubah untuk pertandingan global:sumber
Sumber:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec
Menemukan kecocokan berturut-turut
Jika ekspresi reguler Anda menggunakan bendera "g", Anda dapat menggunakan metode exec () beberapa kali untuk menemukan kecocokan berturut-turut dalam string yang sama. Ketika Anda melakukannya, pencarian dimulai pada substring str yang ditentukan oleh properti lastIndex ekspresi reguler (test () juga akan memajukan properti lastIndex). Misalnya, anggap Anda memiliki skrip ini:
Script ini menampilkan teks berikut:
Catatan: Jangan letakkan literal ekspresi reguler (atau konstruktor RegExp) dalam kondisi while atau itu akan membuat infinite loop jika ada kecocokan karena propertiIndex terakhir disetel ulang pada setiap iterasi. Juga pastikan bahwa flag global diatur atau loop akan terjadi di sini juga.
sumber
String.prototype.match
dengang
flag:'abbcdefabh'.match(/ab*/g)
returns['abb', 'ab']
Jika seseorang (seperti saya) membutuhkan metode Tomalak dengan dukungan array (mis., Beberapa pilih), ini dia:
memasukkan
?my=1&my=2&my=things
hasil
1,2,things
(sebelumnya hanya dikembalikan: barang)sumber
Hanya untuk tetap dengan pertanyaan yang diajukan seperti yang ditunjukkan oleh judul, Anda dapat benar-benar mengulangi setiap pertandingan dalam menggunakan string
String.prototype.replace()
. Sebagai contoh, berikut ini tidak hanya untuk mendapatkan array dari semua kata berdasarkan ekspresi reguler:Jika saya ingin mendapatkan kelompok tangkapan atau bahkan indeks setiap pertandingan saya bisa melakukannya juga. Berikut ini menunjukkan bagaimana setiap pertandingan dikembalikan dengan seluruh pertandingan, grup tangkapan pertama dan indeks:
Setelah menjalankan hal di atas,
words
akan menjadi sebagai berikut:Untuk mencocokkan beberapa kejadian mirip dengan apa yang tersedia di PHP dengan
preg_match_all
Anda dapat menggunakan jenis pemikiran ini untuk membuat Anda sendiri atau menggunakan sesuatu sepertiYourJS.matchAll()
. SJ Anda kurang lebih mendefinisikan fungsi ini sebagai berikut:sumber
YourJS.parseQS()
( yourjs.com/snippets/56 ), meskipun banyak perpustakaan lain juga menawarkan fungsi ini.Jika Anda dapat menggunakan
map
ini adalah solusi empat baris:Tidak cantik, tidak efisien, tetapi setidaknya itu kompak. ;)
sumber
Gunakan
window.URL
:sumber
HELlo dari 2020. Biarkan saya membawa String.prototype.matchAll () ke perhatian Anda:
Output:
sumber
Untuk menangkap beberapa parameter menggunakan nama yang sama, saya memodifikasi loop sementara dalam metode Tomalak seperti ini:
memasukkan:
?firstname=george&lastname=bush&firstname=bill&lastname=clinton
pengembalian:
{firstname : ["george", "bill"], lastname : ["bush", "clinton"]}
sumber
?cinema=1234&film=12&film=34
saya harapkan{cinema: 1234, film: [12, 34]}
. Sunting jawaban Anda untuk mencerminkan ini.Yah ... Saya punya masalah yang sama ... Saya ingin pencarian bertahap / langkah dengan RegExp (misalnya: mulai mencari ... melakukan beberapa pemrosesan ... melanjutkan pencarian sampai pertandingan terakhir)
Setelah banyak pencarian internet ... seperti biasa (ini mengubah kebiasaan sekarang) saya berakhir di StackOverflow dan menemukan jawabannya ...
Whats tidak dirujuk dan yang perlu disebutkan adalah "
lastIndex
" Saya sekarang mengerti mengapa objek RegExp mengimplementasikanlastIndex
properti " "sumber
Membagi itu sepertinya pilihan terbaik bagi saya:
sumber
Untuk menghindari regex hell Anda dapat menemukan pasangan pertama Anda, memotong sepotong kemudian mencoba untuk menemukan yang berikutnya pada substring. Dalam C # ini terlihat seperti ini, maaf saya belum porting ke JavaScript untuk Anda.
sumber