Regex no operador

109

¿Hay un operador NOT en Regexes? Como en esa cadena:"(2001) (asdf) (dasd1123_asd 21.01.2011 zqge)(dzqge) name (20019)"

Quiero borrar todo \([0-9a-zA-z _\.\-:]*\), pero no aquel en el que se trata de un año: (2001).

Entonces, ¿la expresión regular debe devolver debe ser: (2001) name.

NOTA: algo como \((?![\d]){4}[0-9a-zA-z _\.\-:]*\)no funciona para mí (de (20019)alguna manera también coincide ...)

Sonnenhut
fuente
1
Hay una cadena como la de arriba y quiero regex arriba, que el resultado de la expresión regular es: (2001) name.
Sonnenhut

Respuestas:

112

No, no hay un operador no directo. Al menos no de la forma que esperas.

Sin embargo, puede usar una anticipación negativa de ancho cero:

\((?!2001)[0-9a-zA-z _\.\-:]*\)

La (?!...)parte significa "sólo coincide si el texto que sigue (por lo tanto: anticipado) no coincide (por lo tanto: negativo). Pero en realidad no consume los caracteres que coincide (por lo tanto: ancho cero).

En realidad, hay 4 combinaciones de alternativas con 2 ejes:

  • lookbehind / lookahead: especifica si los caracteres antes o después del punto se consideran
  • positivo / negativo: especifica si los caracteres deben coincidir o no .
Joachim Sauer
fuente
Gracias el?! es lo que estaba sugiriendo también, pero de todos modos, si lo uso, \((?![\d]{4})[0-9a-zA-z _\.\-:]+\)todavía hay (20019)en él
Sonnenhut
En la edición de tu pregunta, pones el {4} exterior del lookahead y en este comentario lo pones dentro : ¿cuál probaste? Además: si desea (20019)hacer coincidir, debe agregar el \) interior de su lookahead:\((?![\d]{4}\))[0-9a-zA-z _\.\-:]+\)
Joachim Sauer
Con la expresión regular de arriba en su comentario, funciona. Pero no entiendo eso ... No entiendo por qué escapas de la siguiente parte. \((?![\d]{4} -->\)<--)[0-9a-zA-z _\.\-:]+\)Entonces hay un corchete no cerrado, ¿no?
Sonnenhut
Escapo del paréntesis de cierre )porque quiero hacer coincidir el carácter literal) (¡tal como lo hace al principio y al final de su expresión regular!). Luego, después de igualar eso, finalizo la búsqueda anticipada usando un archivo ).
Joachim Sauer
Entendido. Estaba un poco confundido por todos esos personajes. Gracias.
Sonnenhut
183

No del todo, aunque generalmente puede utilizar alguna solución en uno de los formularios

  • [^abc], que es carácter por carácter no ao bo c,
  • o lookahead negativo:, a(?!b)que ano va seguido deb
  • o lookbehind negativo:, (?<!a)bque bno está precedido pora
Johan Sjöberg
fuente
Sí, creo negativo mirada detrás es b - Referencia (<a?!): Regular-expressions.info/lookaround.html
Jankins
8
Pero [^abc]debería significar no ao bo c, no "no la cadena abc".
Lloviendo