Un error de búsqueda anticipada de JScript/VBScript Regex

Este es uno de los errores de expresiones regulares más extraños y significativos en Internet Explorer. Puede aparecer cuando se usa la elisión opcional dentro de la búsqueda anticipada (por ejemplo, a través de ? , * , {0,n} , o (.|); pero no + , cuantificadores de intervalo a partir de uno o más, o alternancia sin una opción de longitud cero). Un ejemplo en JavaScript:

/(?=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

He estado al tanto de este error durante un par de años, gracias a una publicación de blog de Michael Ash que describe el error con una expresión regular de complejidad de contraseña. Sin embargo, la descripción del error allí es incompleta y sutilmente incorrecta, como se muestra en el caso de prueba reducido anterior. Para ser honesto, aunque el comportamiento errante es predecible, es un poco complicado de describir porque aún no he descubierto exactamente lo que sucede internamente. Recomiendo jugar con variaciones del código anterior para comprender mejor el problema.

Afortunadamente, dado que el error es predecible, generalmente es posible solucionarlo. Por ejemplo, puede evitar el error con la expresión regular de contraseña en la publicación de Michael (/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,15}$/ ) escribiéndolo como /^(?=.{8,15}$)(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).*/ (el .{8,15}$ lookahead debe venir primero aquí). Lo importante es estar al tanto del problema, ya que puede introducir fácilmente errores latentes y difíciles de diagnosticar en su código. Solo recuerda que aparece con una anticipación de longitud variable. Si está usando tales patrones, pruébelos en IE.