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í:
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í.
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):
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-escapearequire-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
use 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
Zatím žádné komentáře.