In dieser Antwort verwendete Terminologie:
- Spiel gibt das Ergebnis an, das sich ergibt, wenn Sie Ihr RegEx-Muster mit Ihrer Zeichenkette vergleichen:
someString.match(regexPattern)
.
- Abgestimmte Muster zeigen alle übereinstimmenden Teile der Eingabezeichenkette an, die sich alle innerhalb der Spiel Array. Dies sind alle Instanzen Ihres Musters in der Eingabezeichenkette.
- Abgestimmte Gruppen geben alle zu fangenden Gruppen an, die im RegEx-Muster definiert sind. (Die Muster in Klammern, etwa so:
/format_(.*?)/g
, donde (.*?)
wäre eine gematchte Gruppe). Diese befinden sich innerhalb übereinstimmende Muster .
Beschreibung
Um Zugang zum abgestimmte Gruppen in jeder der übereinstimmende Muster brauchen Sie eine Funktion oder etwas Ähnliches, um die Daten zu iterieren. Spiel . Es gibt eine Reihe von Möglichkeiten, dies zu tun, wie viele der anderen Antworten zeigen. Die meisten anderen Antworten verwenden eine while-Schleife, um über alle übereinstimmende Muster aber ich denke, wir alle kennen die potenziellen Gefahren, die mit diesem Ansatz verbunden sind. Es ist notwendig, gegen eine new RegExp()
und nicht nur das Muster selbst, das nur in einem Kommentar erwähnt wurde. Dies liegt daran, dass die .exec()
Methode verhält sich ähnlich wie eine Generatorfunktion - es wird jedes Mal angehalten, wenn es eine Übereinstimmung gibt sondern behält seine .lastIndex
um von dort aus mit der nächsten .exec()
anrufen.
Code-Beispiele
Nachfolgend ein Beispiel für eine Funktion searchString
die eine Array
von allen übereinstimmende Muster , wobei jede match
ist ein Array
mit allen enthaltenen abgestimmte Gruppen . Anstatt eine while-Schleife zu verwenden, habe ich Beispiele gegeben, die sowohl die Array.prototype.map()
Funktion als auch eine leistungsfähigere Methode - die Verwendung einer einfachen for
-Schleife.
Prägnante Versionen (weniger Code, mehr syntaktischer Zucker)
Diese sind weniger leistungsfähig, da sie im Grunde eine forEach
-Schleife anstelle der schnelleren for
-Schleife.
// 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
Leistungsfähige Versionen (mehr Code, weniger syntaktischer Zucker)
// 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
Ich muss diese Alternativen noch mit den in den anderen Antworten genannten vergleichen, aber ich bezweifle, dass dieser Ansatz weniger leistungsfähig und weniger ausfallsicher ist als die anderen.