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.