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 ...)


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 .

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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.