Rumah  >  Artikel  >  hujung hadapan web  >  Bagaimanakah anda boleh menangkap berbilang kumpulan dalam ekspres semula JavaScript apabila pengulangan hanya mengekalkan perlawanan terakhir?

Bagaimanakah anda boleh menangkap berbilang kumpulan dalam ekspres semula JavaScript apabila pengulangan hanya mengekalkan perlawanan terakhir?

DDD
DDDasal
2024-11-16 22:40:03650semak imbas

How can you capture multiple groups in a JavaScript regexp when the repetition only keeps the last match?

Menangkap Berbilang Kumpulan dalam JavaScript Regexp

Apabila bekerja dengan ungkapan biasa dalam JavaScript, adalah mungkin untuk menangkap berbilang kumpulan padanan dalam rentetan . Walau bagaimanapun, terdapat had kepada bilangan kumpulan yang boleh ditangkap dan diambil semula.

Pertimbangkan regexp JavaScript berikut:

"foo bar baz".match(/^(\s*\w+)+$/)

Orang mungkin menjangkakan regexp ini mengembalikan tatasusunan yang mengandungi keseluruhan rentetan "foo bar baz" serta setiap perkataan individu:

["foo bar baz", "foo", " bar", " baz"]

Walau bagaimanapun, regexp sebenarnya hanya mengembalikan yang terakhir padanan ditangkap:

["foo bar baz", " baz"]

Tingkah laku ini berlaku kerana, dalam kebanyakan perisa regexp, hanya tangkapan terakhir untuk kumpulan tangkapan berulang dikekalkan. Dalam JavaScript, mengulangi kumpulan penangkapan hanya membenarkan penangkapan bilangan rentetan yang ditetapkan setiap perlawanan.

Untuk mengatasi had ini, terdapat beberapa pilihan:

  • Pemisahan pada pembatas: Jika boleh, pertimbangkan untuk membelah rentetan pada pembatas yang sesuai dan bukannya menggunakan regexp dengan tangkapan berulang kumpulan.
  • Menggunakan gelung exec global: Padankan kumpulan berulang dalam satu perlawanan menggunakan bendera /pattern/g dan kemudian proses keputusan menggunakan gelung exec. Ambil perhatian bahawa kaedah ini tidak sepenuhnya bersamaan dengan kumpulan penangkapan berulang.
  • Padanan berbilang peringkat: Tangkap kumpulan yang berulang dalam satu perlawanan dan kemudian gunakan regexp kedua untuk memecahkan perlawanan itu.

Contoh:

Untuk memadankan rentetan dalam teks menggunakan padanan berbilang peringkat:

var text = "a;b;<c;d;e;f>;g;h;i;<no no no>;j;k;<xx;yy;zz>;";

var r = /<(\w+(;\w+)*)>/g;

var match;
while ((match = r.exec(text)) != null) {
  print(match[1].split(";"));
}

Pendekatan ini menggunakan dua peringkat padanan untuk mengekstrak perkataan individu daripada rentetan.

Atas ialah kandungan terperinci Bagaimanakah anda boleh menangkap berbilang kumpulan dalam ekspres semula JavaScript apabila pengulangan hanya mengekalkan perlawanan terakhir?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn