Signatur
Beschreibung
Die Eigenschaft hasRegExpGroups einer URLPattern-Instanz ist true, wenn in irgendeiner der acht Komponenten (protocol, username, password, hostname, port, pathname, search, hash) eine eigene Regex-Gruppe vorkommt, z. B. :id(\\d+) oder eine unbenannte Gruppe (foo|bar). Sonst ist sie false.
Wichtig ist, was nicht mitzählt: Benannte Gruppen ohne eigenen Ausdruck (:id), Platzhalter (*), Modifikatoren (?, +, *) und Gruppen mit geschweiften Klammern ({...}) sind reine Pattern-Syntax. Sie werden intern zwar auch als reguläre Ausdrücke umgesetzt, setzen hasRegExpGroups aber nicht auf true.
Gebraucht wird die Eigenschaft vor allem dann, wenn Muster aus Quellen kommen, denen man nicht voll vertraut, oder wenn eine API nur „einfache“ Muster erlaubt. Die Static-Routing-API für Service Worker in Chromium lehnt zum Beispiel Muster mit Regex-Gruppen ab. Mit hasRegExpGroups kann man solche Muster vorher selbst finden und abweisen. Das bewahrt auch vor aufwendigen oder anfälligen Ausdrücken (ReDoS).
Rückgabewert
true, wenn mindestens eine Komponente eine eigene Regex-Gruppe enthält, sonst false. Die Eigenschaft ist schreibgeschützt.Beispiele
Einfache Muster und Muster mit Regex-Gruppen vergleichen
const einfach = new URLPattern({ pathname: '/books/:id' });
const mitRegex = new URLPattern({ pathname: '/books/:id(\\d+)' });
const unbenannt = new URLPattern({ pathname: '/(de|en)/*' });
const wildcard = new URLPattern({ pathname: '/assets/*', search: '*' });
console.log(einfach.hasRegExpGroups);
console.log(mitRegex.hasRegExpGroups);
console.log(unbenannt.hasRegExpGroups);
console.log(wildcard.hasRegExpGroups);
Nutzerdefinierte Routen prüfen und Regex-Gruppen ablehnen
const erstelleRoute = (muster, baseURL) => {
const pattern = new URLPattern(muster, baseURL);
if (pattern.hasRegExpGroups) {
throw new Error(`Regex-Gruppen sind nicht erlaubt: ${muster}`);
}
return pattern;
};
const eingaben = ['/shop/:kategorie/:produkt', '/shop/:id([0-9]+)'];
for (const muster of eingaben) {
try {
const route = erstelleRoute(muster, 'https://example.com');
console.log('OK:', route.pathname);
} catch (err) {
console.warn(err.message);
}
}
Regex-Gruppe in einer anderen Komponente als dem Pfad
const pattern = new URLPattern({
hostname: '(www|api).example.com',
pathname: '/v1/*'
});
console.log(pattern.hasRegExpGroups);
console.log(pattern.test('https://api.example.com/v1/users'));
// Wichtig · Fallstricke
- Benannte Gruppen ohne eigenen Ausdruck zählen nicht:
:idund*ergebenfalse. Erst:id(...)oder(...)ergibttrue. - Escaping in String-Literalen: In JavaScript-Strings muss der Backslash verdoppelt werden (
'\\\\d+'). Sonst entsteht ein anderes Muster oder einTypeError. - Die Eigenschaft ist schreibgeschützt. Eine Zuweisung wird ignoriert bzw. löst im Strict Mode einen
TypeErroraus. - Kompatibilität:
hasRegExpGroupskam erst nachURLPatternselbst dazu (Chromium 122). Ältere Chromium-Versionen kennenURLPattern, liefern hier aberundefined. Deshalb gezielt prüfen, z. B. mit'hasRegExpGroups' in URLPattern.prototype, und bei Bedarf ein Polyfill wieurlpattern-polyfillnutzen.