Bu cevapta kullanılan terminoloji:
- Maç şöyle dizenizle karşı RegEx desen çalışan sonucunu gösterir:
someString.match(regexPattern)
.
- Eşleşen desenler , giriş dizesinin, eşleşen dizinin içinde bulunan tüm eşleşen bölümlerini gösterir . Bunların tümü, giriş dizesinin içindeki modelinizin örnekleridir.
- Eşleşen gruplar , RegEx modelinde tanımlanan yakalanacak tüm grupları belirtir. (Parantez içindeki kalıplar
/format_(.*?)/g
, (.*?)
şöyle : Eşleşen bir grup olacaktır.) Bunlar eşleşen kalıplarda bulunur .
Açıklama
Eşleşen gruplara erişmek için, eşleşen desenlerin her birinde , eşleşme üzerinde yinelenen bir işleve veya benzeri bir şeye ihtiyacınız vardır . Diğer yanıtların birçoğunun gösterdiği gibi, bunu yapmanın birkaç yolu vardır. Diğer yanıtların çoğu , eşleşen tüm kalıpları yinelemek için bir while döngüsü kullanır , ancak bence bu yaklaşımdaki potansiyel tehlikeleri biliyoruz. new RegExp()
Sadece bir yorumda bahsedilen sadece kalıbın kendisi ile eşleşmek gerekir . Bunun nedeni, .exec()
yöntemin bir jeneratör işlevine benzer şekilde davranmasıdır - her eşleşme olduğunda durur , ancak bir .lastIndex
sonraki .exec()
çağrıda oradan devam etmesini sağlar .
Kod örnekleri
Aşağıda, eşleşen tüm desenlerden birini searchString
döndüren bir işlev örneği verilmiştir ; burada her biri , eşleşen tüm gruplarla birdir . While döngüsü kullanmak yerine, hem işlevi hem de daha performanslı bir yolla örnekler verdim - düz- döngü kullanarak .Array
match
Array
Array.prototype.map()
for
Kısa versiyonlar (daha az kod, daha sözdizimsel şeker)
Temelde forEach
daha hızlı- for
döngü yerine bir- döngü uyguladığından bunlar daha az performans gösterir.
// 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
Performanslı versiyonlar (daha fazla kod, daha az sözdizimsel şeker)
// 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
Bu alternatifleri daha önce diğer cevaplarda belirtilenlerle karşılaştırmadım, ancak bu yaklaşımın diğerlerinden daha az performans ve daha az başarısızlık olduğundan şüpheliyim.