2011-09-06 15 views
44

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

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

Así que lo que debe devolver la expresión regular debe ser: (2001) name.

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

+0

No estoy seguro de entender lo que desea hacer coincidir (o por qué pones todos esos parens alrededor de texto plano) – Mat

+1

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

Respuesta

51

No, no hay ningún operador no directa. Al menos no de la manera que esperas.

Se puede utilizar una búsqueda negativa hacia delante de anchura cero, sin embargo:

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

La parte (?!...) significa "único partido si el texto siguiente (por lo tanto: búsqueda hacia delante), este no (por lo tanto: negativo) que coincida con esto, pero en realidad no consumen los caracteres que coincide con (por lo tanto:..) de ancho cero

en realidad, hay 4 combinaciones de lookarounds con 2 ejes:

  • de búsqueda hacia atrás/búsqueda hacia delante: especifica si los caracteres antes o después de se considera el punto
  • positivo/negativo: especifica si los caracteres mosto partido o no debe partido.
+0

¡Gracias! es lo que estaba sugiriendo también, pero de todos modos si uso '\ ((?! [\ d] {4}) [0-9a-zA-z _ \. \ -:] + \)' todavía hay '(20019) 'en él – Sonnenhut

+0

En la edición de su pregunta, coloca el' {4} '* fuera * de la búsqueda anticipada y en este comentario lo coloca * dentro *: ¿cuál intentó? Además: si desea que '(20019)' coincida, debe agregar '\)' * dentro * su búsqueda anticipada: '\ ((?! [\ D] {4} \)) [0-9a-zA -z _ \. \ -:] + \) ' –

+0

Con la expresión regular anterior en tu comentario, funciona. Pero no entiendo eso ... No entiendo por qué escapaste a la siguiente parte '' \ ((?! [\ D] {4} -> \) <-) [0-9a-zA -z _ \. \ -:] + \) '' Entonces hay un corchete no cerrado, ¿no? – Sonnenhut

88

No del todo, aunque por lo general por lo general puede usar un poco de solución en una de las formas

  • [^abc], que es cualquier cosa menos abc,
  • o búsqueda negativa hacia delante: a(?!b), que es a no seguida de b
  • o negativo de búsqueda hacia atrás: (?<!a)b, que se b no precedida por a
+0

Sí, creo que el aspecto negativo es (? jankins