La razón de su expresión regular invertida no está funcionando se debe a la '^
' dentro de la búsqueda negativa hacia delante:
/^((?!^[ab].).)*$/
^ # WRONG
Tal vez sea diferente en vim, pero en todos los sabores de expresiones regulares que conozco, la caret coincide con el comienzo de la cadena (o el comienzo de una línea en modo multilínea). Pero creo que fue solo un error tipográfico en la entrada del blog.
También debe tener en cuenta la semántica de la herramienta de expresiones regulares que está utilizando. Por ejemplo, en Perl, esto es cierto:
"abc" =~ /[ab]./
Pero en Java, esto no es:
"abc".matches("[ab].")
Esto se debe a la expresión regular se pasa al método matches()
está anclado de manera implícita en ambos extremos (es decir, , /^[ab].$/
).
Tomando lo más común, la semántica de Perl, /[ab]./
significa que la cadena de destino contiene una secuencia que consta de un carácter 'a' o 'b' seguido de al menos uno (sin separador de línea). En otras palabras, en CUALQUIER punto, la condición es VERDADERO. El inverso de esa afirmación es que, en CADA punto, la condición es FALSA. Eso significa que, antes de consumir cada personaje, se realiza una búsqueda negativa hacia delante para confirmar que el personaje no es el comienzo de una secuencia coincidente:
(?![ab].).
Y usted tiene que examinar cada carácter, así, el texto tiene para ser anclado en ambos extremos:
/^(?:(?![ab].).)*$/
Esa es la idea general, pero no creo que es posible invertir cada expresiones regulares - no cuando las expresiones regulares originales pueden incluir lookarounds positivos y negativos, reacio y posesivos cuantificadores, y quién sabe s-qué.
¿Qué paquete de expresiones regulares está usando (el idioma que estás trabajando en)? Si su paquete de expresiones regulares no es compatible con un paquete PCRE (RegEx compatible con Perl) bastante moderno, puede ser que simplemente esté malinterpretando el ejemplo de Zijab (la búsqueda negativa de ancho cero). –