Testowanie funkcji kompilacji wyrażeń regularnych w IE11

Jan 05 2021

Chciałbym przetestować unikody właściwości Unicode Regex, aby uniknąć kompilowania uszkodzonego wyrażenia regularnego w przeglądarkach, które go nie obsługują (na przykład IE11). Idealnie chciałbym napisać coś w stylu:

if (regex supports unicode property escapes) {
    return /\p{Emoji_Modifier_Base}\p{Emoji_Modifier}?|\p{Emoji_Presentation}|\p{Emoji}\uFE0F/gu;
} else {
    return /somereplacementregex/;
}

Czy to w ogóle możliwe? Wiem, że istnieją interfejsy API do wykrywania funkcji, ale o ile wiem, nie ma jednego dla wyrażenia regularnego. Alternatywnie, jeśli istnieje inny sposób napisania tego, który nie zepsuje kompilacji i wyrzuci błąd, który mogę złapać, to również byłby świetny.

Odpowiedzi

1 Expressionist Jan 05 2021 at 04:07

Działa to w przeglądarce Firefox lub Safari; powinno być w porządku w IE11:

let regex = /somereplacementregex/;
try
{
    regex = new RegExp ("\\p{Emoji_Modifier_Base}\\p{Emoji_Modifier}?|\\p{Emoji_Presentation}|\\p{Emoji}\\uFE0F", "gu");
}
catch (e) { }
//
// use regex...
console.log (regex);
1 David784 Jan 05 2021 at 01:13

Jeśli czujesz się komfortowo z czymś takim jak Functionlub eval, a try/catch... coś takiego powinno działać:

try { 
  return new Function('', 'return /\\p{Script=Greek}/u;')() 
} catch(e) { return /asdf/g;}

Zauważ, że musisz uciec przed \\pznakiem, ponieważ jest teraz zawarty w ciągu. Przetestowałem to na IE11 i zadziałało (powróciło bez krytycznego błędu analizy)