Start · Sprachen · JavaScript · Referenz · URLPattern.hasRegExpGroups

URLPattern.hasRegExpGroups

Eigenschaft

Schreibgeschützter Boolean, der angibt, ob mindestens eine Komponente eines <code>URLPattern</code> eigene reguläre Ausdrucksgruppen wie <code>(\\d+)</code> enthält.

seit JavaScript Chrome/Edge 122+, Firefox 142+, Safari 26+, Node.j Kategorie: webapi

Signatur

URLPattern.prototype.hasRegExpGroups

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

Typ
boolean
Beschreibung
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);
false true true false

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);
  }
}
OK: /shop/:kategorie/:produkt Regex-Gruppen sind nicht erlaubt: /shop/:id([0-9]+)

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'));
true true

// Wichtig · Fallstricke

  • Benannte Gruppen ohne eigenen Ausdruck zählen nicht: :id und * ergeben false. Erst :id(...) oder (...) ergibt true.
  • Escaping in String-Literalen: In JavaScript-Strings muss der Backslash verdoppelt werden ('\\\\d+'). Sonst entsteht ein anderes Muster oder ein TypeError.
  • Die Eigenschaft ist schreibgeschützt. Eine Zuweisung wird ignoriert bzw. löst im Strict Mode einen TypeError aus.
  • Kompatibilität: hasRegExpGroups kam erst nach URLPattern selbst dazu (Chromium 122). Ältere Chromium-Versionen kennen URLPattern, liefern hier aber undefined. Deshalb gezielt prüfen, z. B. mit 'hasRegExpGroups' in URLPattern.prototype, und bei Bedarf ein Polyfill wie urlpattern-polyfill nutzen.