Sie können auf diese Weise auf die Erfassungsgruppen zugreifen:
var myString = "something format_abc";
var myRegexp = /(?:^|\s)format_(.*?)(?:\s|$)/g;
var myRegexp = new RegExp("(?:^|\s)format_(.*?)(?:\s|$)", "g");
var match = myRegexp.exec(myString);
console.log(match[1]); // abc
Und wenn es mehrere Übereinstimmungen gibt, können Sie diese iterativ durchgehen:
var myString = "something format_abc";
var myRegexp = new RegExp("(?:^|\s)format_(.*?)(?:\s|$)", "g");
match = myRegexp.exec(myString);
while (match != null) {
// matched text: match[0]
// match start: match.index
// capturing group n: match[n]
console.log(match[0])
match = myRegexp.exec(myString);
}
Bearbeiten: 2019-09-10
Wie Sie sehen können, war die Art und Weise der Iteration über mehrere Übereinstimmungen nicht sehr intuitiv. Dies führte zu dem Vorschlag, die String.prototype.matchAll
Methode. Diese neue Methode wird voraussichtlich in den nächsten ECMAScript 2020-Spezifikation . Es gibt uns eine saubere API und löst mehrere Probleme. Es wurde begonnen, auf den wichtigsten Browsern und JS-Engines zu landen als Chrome 73+ / Node 12+ und Firefox 67+.
Die Methode gibt einen Iterator zurück und wird wie folgt verwendet:
const string = "something format_abc";
const regexp = /(?:^|\s)format_(.*?)(?:\s|$)/g;
const matches = string.matchAll(regexp);
for (const match of matches) {
console.log(match);
console.log(match.index)
}
Da sie einen Iterator zurückgibt, kann man sagen, dass sie träge ist. Dies ist nützlich, wenn man eine besonders große Anzahl von Erfassungsgruppen oder sehr große Zeichenketten handhabt. Bei Bedarf kann das Ergebnis aber auch einfach in ein Array umgewandelt werden, indem man die Verbreitungssyntax oder die Array.from
Methode:
function getFirstGroup(regexp, str) {
const array = [...str.matchAll(regexp)];
return array.map(m => m[1]);
}
// or:
function getFirstGroup(regexp, str) {
return Array.from(str.matchAll(regexp), m => m[1]);
}
In der Zwischenzeit, bis dieser Vorschlag eine breitere Unterstützung findet, können Sie die offizielles Unterlegscheibenpaket .
Auch die interne Funktionsweise der Methode ist einfach. Eine äquivalente Implementierung mit einer Generatorfunktion würde wie folgt aussehen:
function* matchAll(str, regexp) {
const flags = regexp.global ? regexp.flags : regexp.flags + "g";
const re = new RegExp(regexp, flags);
let match;
while (match = re.exec(str)) {
yield match;
}
}
Es wird eine Kopie der ursprünglichen Regexp erstellt, um Nebenwirkungen durch die Mutation der Regexp zu vermeiden. lastIndex
Eigenschaft beim Durchlaufen der Mehrfachtreffer.
Außerdem müssen wir sicherstellen, dass die Regexp die weltweit Flag, um eine Endlosschleife zu vermeiden.
Ich freue mich auch, dass sogar auf diese StackOverflow-Frage in der Diskussionen über den Vorschlag .