Zpět na domů

RegExp.escape() escapuje písmena a mezery: proč

RegExp.escape() escapuje latinská písmena, číslice a mezery pro bezpečné zřetězení regulárních výrazů. Standard to vyžaduje pro vyhnutí chyb s zachytávacími skupinami a legacy-sekvencemi. Doporučuje se používat s příznakem u a polyfilem.

Proč RegExp.escape() skrývá písmena do \x-kódů?
Advertisement 728x90

Escapování v RegExp.escape(): proč se písmena, číslice a mezery mění na \x-kódy

Funkce RegExp.escape(), která se objevila v prohlížečích v roce 2025, escapuje nejen řídicí symboly regulárních výrazů, ale i latinská písmena, číslice na začátku řetězce, mezery a interpunkci jako @. To se liší od tradičních vlastních escape-funkcí, které tyto symboly ignorovaly. Standard ECMAScript to vyžaduje pro prevenci chyb při konkatenaci RegExp.

Důvody escapování číslic a písmen

Číslice na začátku řetězce se escapují, aby se zabránilo jejich interpretaci jako čísla zachytávacích skupin nebo oktalových kódů. Latinská písmena slouží pro správnou práci s escape-sekvencemi jako \c.

Příklad s číslicí:

Google AdInline article slot
p = '2'
new RegExp('()\\1' + RegExp.escape(p)).source // ()\\1\\x32
new RegExp('()\\1' + p).source // ()\\12

Bez escapování \12 odkazuje na 12. skupinu nebo symbol s oktalovým kódem 12. S escapováním se hledá skupina 1 následovaná symbolem 2.

Příklad s písmenem:

p = 'a'
new RegExp('\\c' + RegExp.escape(p)).source // \\c\\x61
new RegExp('\\c' + p).source // \\ca

\ca se interpretuje jako řídicí symbol (kód 1), \c\x61 jako sekvence \c a a. V Unicode režimu (u nebo v) takové konstrukce vyvolají SyntaxError, což usnadňuje ladění.

Google AdInline article slot

Mezery a interpunkce: preventivní ochrana

Standard ne vysvětluje escapování mezer a symbolů jako @. V repozitáři TC39 je uvedeno: escapují se všechny symboly, které by mohly v budoucnosti způsobit "context escape". To fixuje vstup a výstup z kontextů pouze přes mezery nebo ASCII interpunkci.

Takový přístup je kontroverzní: přidává overhead bez aktuální potřeby. Návrh vlajky x pro ignorování mezer uvízl na první stádiu ze čtyř.

Srovnání s vlastními funkcemi

Klasiická escape-funkce z MDN (2020):

Google AdInline article slot
function escapeRegExp(string) {
    return string.replace(/[.*+?^${}()|[\\]\\]/g, '\\$&');
}

Pokryje řídicí symboly, ale ne číslice ani písmena. Vylepšená verze s escapováním vedoucí číslice a pomlčky:

function escapeRegExp(string) {
    const coolCmd = string => string.replace(/[.*+?^${}()|[\\]\\]/g, '\\$&')
        .replaceAll('-', '\\x2d');
    const charCode = string.charCodeAt(0);
    return charCode >= 0x30 && charCode <= 0x39
        ? `\\x${charCode.toString(16)}${coolCmd(string.slice(1))}`
        : coolCmd(string);
}

| Aspekt | RegExp.escape() | Vlastní (vylepšená) |

|---------------------|------------------|-----------------------|

| Číslice na začátku | \x32 | \x32 |

| Latinská písmena | \x61 | Ne |

| Mezery/@ | \x20/\x40 | Ne |

| Výkon | Nativní | Na bázi RegExp |

Doporučení k použití

  • Pro nový kód: Používejte RegExp.escape() s polyfillem pro starší prostředí.
  • Unicode režim: Vždy přidávejte vlajku u – odhaluje chyby již v fázi parsování.
  • ESLint: Zapněte pravidlo @eslint/regexp/no-octal-escape a require-unicode-regexp.
// Polyfill není povinný, ale užitečný
const polyfill = () => {
  RegExp.escape = RegExp.escape || function(s) {
    return s.replace(/[-[\]\/{}()\*+?\.\\^$|]/g, '\\$&');
    // Doplnit podle potřeby
  };
};

Co je důležité

  • RegExp.escape() escapuje číslice/písmena pro konkatenaci RegExp, mezery pro budoucnost.
  • Bez vlajky u se chyby maskují; s vlajkou – SyntaxError při parsování.
  • Vlastní funkce jsou zastaralé: migrovat na nativní s polyfillem.
  • Vyhněte se \cX – legacy, nahraďte explicitními kódy.
  • Vlajka x (ignorovat mezery) je nepravděpodobná.

— Editorial Team

Advertisement 728x90

Číst dál