Seien Sie vorsichtig bei der Verwendung von RegExp.prototype.exec()
Funktion, um eine Zeichenfolge zu finden. Das konstruierte Regex-Objekt ist zustandsabhängig, d.h. jedes Mal, wenn Sie die Funktion .exec()
wirkt es sich auf die lastIndex
Eigenschaft der Regex-Instanz. Daher sollten Sie immer die lastIndex
Eigenschaft, bevor Sie eine Instanz des Regex-Objekts verwenden.
let re,
findAAs;
re = /AA/;
findAAs = (input) => {
let match;
// `re` is cached instance of regex object.
// Reset `re.lastIndex` every time before using it.
re.lastIndex = 0;
while ((match = re.exec(input)) !== null) {
match.index; // Match index.
match[0]; // Matching string.
}
};
Eine verlockende Alternative ist, das Regex-Objekt bei jeder Ausführung zu konstruieren. Je nachdem, wie ressourcenintensiv Ihre Aufgabe ist, ist auch dies eine Option.
let findAAs;
findAAs = (input) => {
let match,
re;
re = /AA/;
while ((match = re.exec(input)) !== null) {
match.index; // Match index.
match[0]; // Matching string.
}
};
Eine pragmatische Alternative zur Verwendung .exec()
es String.prototype.replace()
.
let findAAs,
re;
re = /AA/;
findAAs = (input) => {
let match,
re;
input.replace(re, (match, index) => {
match; // Matching string.
index; // Match index.
return '';
});
};
Der Nachteil dieses Ansatzes ist, dass eine Kopie der Betreff-Zeichenkette erstellt wird.
Ob Sie es verwenden sollten oder nicht, hängt davon ab, wie ressourcenintensiv Ihre Aufgabe ist. Ich persönlich vermeide gerne while
Blöcke in meinem Code und bevorzuge daher die .replace()
Ansatz.