regex - tabla - ¿Negación de expresiones regulares?
tabla de expresiones regulares (3)
Estoy jugando a Regex Golf ( http://regex.alf.nu/ ) y estoy haciendo el agujero de Abba. Tengo la siguiente expresión regular que coincide completamente con el lado equivocado (que es lo que estaba tratando de hacer):
(([/w])([/w])/3/2)
Sin embargo, estoy tratando de negarlo ahora para que coincida con el otro lado. Parece que no puedo entender esa parte. Lo intenté:
(?!([/w])([/w])/3/2)
Pero eso no funcionó. ¿Algún consejo de los maestros de expresiones regulares?
La clave aquí resulta ser el caret principal, ^, y el. *
(?! ...) es una construcción anticipada, y por lo tanto no avanza el motor de procesamiento de expresiones regulares.
/ (?! ...) / en sí mismo devolverá correctamente un resultado negativo para los elementos que coincidan con la expresión dentro; pero para los elementos que no coinciden (...) el motor de expresiones regulares continúa procesando. Sin embargo, si su expresión regular solo contiene el (?!) No queda nada para procesar, y la posición de procesamiento de expresiones regulares nunca avanza. (Ver esta gran respuesta ).
Aparentemente, como la expresión regular restante está vacía, coincide con cualquier segmento de ancho cero de una cadena, es decir, coincide con cualquier cadena.
[comienza SWAG]
Con caret ^ present, el motor de expresiones regulares puede reconocer que está buscando una respuesta real y que no desea que le diga que la cadena contiene componentes de ancho cero.
[final SWAG]
Por lo tanto, puede fallar correctamente cuando el (?!) Tiene éxito.
Puedes hacerlo mucho más corto (y obtener más puntos) simplemente usando .
y eliminando parens innecesarios:
^(?!.*(.)(.)/2/1)
Simplemente se asegura de que no haya "abba" ("abba" aquí significa 4 letras en ese orden en particular que no queremos que coincida) en cualquier parte de la cadena sin tener que coincidir con toda la palabra.
Usando la explicación aquí: https://.com/a/406408/584663
Se me ocurrió: ^((?!((/w)(/w)/4/3)).)*$