Chyba dopředného výhledu JScript/VBScript Regex

Zde je jedna z nejpodivnějších a nejvýznamnějších chyb regulárních výrazů v aplikaci Internet Explorer. Může se objevit při použití volitelného odstranění v rámci předběžných dotazů (např. přes ? , * , {0,n} nebo (.|); ale ne + , intervalové kvantifikátory začínající od jedné nebo vyšší nebo alternace bez možnosti nulové délky). Příklad v JavaScriptu:

/(?=a?b)ab/.test("ab");
// Should return true, but IE 5.5 – 8b1 return false

/(?=a?b)ab/.test("abc");
// Correctly returns true (even in IE), although the
// added "c" does not take part in the match

O této chybě vím již několik let díky příspěvku na blogu Michaela Ashe, který popisuje chybu s regulárním výrazem složitosti hesla. Popis chyby je však neúplný a mírně nesprávný, jak ukazuje výše uvedený redukovaný testovací případ. Abych byl upřímný, i když je bludné chování předvídatelné, je trochu složité ho popsat, protože jsem ještě přesně nepřišel na to, co se uvnitř děje. Doporučuji si pohrát s variantami výše uvedeného kódu, abyste lépe porozuměli problému.

Naštěstí, protože je chyba předvídatelná, je obvykle možné ji obejít. Můžete se například vyhnout chybě s regulárním výrazem hesla v Michaelově příspěvku (/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,15}$/ ) zapsáním jako /^(?=.{8,15}$)(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).*/ (.{8,15}$ napřed zde musí být napřed). Důležité je uvědomit si problém, protože to může do vašeho kódu snadno vnést latentní a obtížně diagnostikovatelné chyby. Pamatujte, že se zobrazuje s proměnnou délkou výhledu. Pokud takové vzory používáte, vyzkoušejte je sakra v IE.