Terminologi yang digunakan dalam jawaban ini:
- Pertandingan menunjukkan hasil menjalankan pola regex Anda terhadap string Anda seperti:
someString.match(regexPattern)
.
- Pola yang cocok menunjukkan semua bagian yang cocok dari string input, yang semuanya berada di dalam array yang cocok . Ini semua adalah contoh dari pola Anda di dalam string input.
- Grup yang cocok menunjukkan semua grup untuk ditangkap, didefinisikan dalam pola RegEx. (Pola di dalam tanda kurung, seperti:
/format_(.*?)/g
mana (.*?)
akan menjadi kelompok yang cocok.) Ini berada dalam pola yang cocok .
Deskripsi
Untuk mendapatkan akses ke grup yang cocok , di masing-masing pola yang cocok , Anda memerlukan fungsi atau sesuatu yang mirip dengan iterate selama pertandingan . Ada beberapa cara Anda bisa melakukan ini, seperti yang ditunjukkan oleh banyak jawaban lainnya. Sebagian besar jawaban lain menggunakan perulangan sementara untuk mengulangi semua pola yang cocok , tapi saya pikir kita semua tahu potensi bahaya dengan pendekatan itu. Penting untuk mencocokkan dengan new RegExp()
bukan hanya pola itu sendiri, yang hanya disebutkan dalam komentar. Ini karena .exec()
metode ini berperilaku mirip dengan fungsi generator - berhenti setiap kali ada kecocokan , tetapi tetap .lastIndex
melanjutkan dari .exec()
panggilan berikutnya .
Contoh kode
Di bawah ini adalah contoh dari fungsi searchString
yang mengembalikan suatu Array
dari semua pola yang cocok , di mana masing match
- masing adalah Array
dengan semua kelompok yang cocok yang berisi . Alih-alih menggunakan loop sementara, saya telah memberikan contoh menggunakan kedua Array.prototype.map()
fungsi serta cara yang lebih performant - menggunakan for
-loop polos .
Versi ringkas (lebih sedikit kode, lebih banyak gula sintaksis)
Ini kurang berkinerja karena mereka pada dasarnya menerapkan forEach
-loop daripada yang lebih cepat for
-loop.
// Concise ES6/ES2015 syntax
const searchString =
(string, pattern) =>
string
.match(new RegExp(pattern.source, pattern.flags))
.map(match =>
new RegExp(pattern.source, pattern.flags)
.exec(match));
// Or if you will, with ES5 syntax
function searchString(string, pattern) {
return string
.match(new RegExp(pattern.source, pattern.flags))
.map(match =>
new RegExp(pattern.source, pattern.flags)
.exec(match));
}
let string = "something format_abc",
pattern = /(?:^|\s)format_(.*?)(?:\s|$)/;
let result = searchString(string, pattern);
// [[" format_abc", "abc"], null]
// The trailing `null` disappears if you add the `global` flag
Versi performan (lebih banyak kode, lebih sedikit gula sintaksis)
// Performant ES6/ES2015 syntax
const searchString = (string, pattern) => {
let result = [];
const matches = string.match(new RegExp(pattern.source, pattern.flags));
for (let i = 0; i < matches.length; i++) {
result.push(new RegExp(pattern.source, pattern.flags).exec(matches[i]));
}
return result;
};
// Same thing, but with ES5 syntax
function searchString(string, pattern) {
var result = [];
var matches = string.match(new RegExp(pattern.source, pattern.flags));
for (var i = 0; i < matches.length; i++) {
result.push(new RegExp(pattern.source, pattern.flags).exec(matches[i]));
}
return result;
}
let string = "something format_abc",
pattern = /(?:^|\s)format_(.*?)(?:\s|$)/;
let result = searchString(string, pattern);
// [[" format_abc", "abc"], null]
// The trailing `null` disappears if you add the `global` flag
Saya belum membandingkan alternatif ini dengan yang sebelumnya disebutkan dalam jawaban lain, tetapi saya ragu pendekatan ini kurang berkinerja dan kurang aman-gagal daripada yang lain.