Regex no operador

Resuelto Sonnenhut asked hace 13 años • 4 respuestas

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

Quiero eliminar todos \([0-9a-zA-z _\.\-:]*\)menos aquel en el que es un año: (2001).

Entonces, lo que debería devolver la expresión regular debe ser: (2001) name.

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

Sonnenhut avatar Sep 06 '11 15:09 Sonnenhut
Aceptado

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

  • [^abc], que es carácter por carácter no ao bo c,
  • o anticipación negativa: a(?!b), que ano va seguida deb
  • o lookbehind negativo: (?<!a)b, que bno está precedido pora
Johan Sjöberg avatar Sep 06 '2011 08:09 Johan Sjöberg

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

Sin embargo, puedes utilizar una búsqueda anticipada negativa de ancho cero:

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

La (?!...)parte significa "solo coincide si el texto siguiente (por lo tanto: anticipación) no coincide (por lo tanto: negativo). Pero en realidad no consume los caracteres con los que coincide (por lo tanto: ancho cero).

En realidad, existen 4 combinaciones de miradas con 2 ejes:

  • lookbehind/lookahead: especifica si se consideran los caracteres anteriores o posteriores al punto
  • positivo/negativo: especifica si los caracteres deben coincidir o no .
Joachim Sauer avatar Sep 06 '2011 08:09 Joachim Sauer

Podrías capturar la (2001)pieza y reemplazar el resto sin nada.

public static string extractYearString(string input) {
    return input.replaceAll(".*\(([0-9]{4})\).*", "$1");
}

var subject = "(2001) (asdf) (dasd1123_asd 21.01.2011 zqge)(dzqge) name (20019)";
var result = extractYearString(subject);
System.out.println(result); // <-- "2001"

.*\(([0-9]{4})\).*medio

  • .*coincide con cualquier cosa
  • \(coincidir con un (personaje
  • (comenzar la captura
  • [0-9]{4}cualquier dígito cuatro veces
  • )captura final
  • \)coincidir con un )personaje
  • .*cualquier cosa (resto de la cuerda)
birgersp avatar Oct 13 '2020 06:10 birgersp