Regex no operador
¿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...)
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 noa
ob
oc
,- o anticipación negativa:
a(?!b)
, quea
no va seguida deb
- o lookbehind negativo:
(?<!a)b
, queb
no está precedido pora
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 .
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)