Regex para comparar con algo que no sea una subcadena específica
-
09-06-2019 - |
Pregunta
Estoy buscando una expresión regular que coincida con una cadena que comienza con una subcadena y no termina con una subcadena determinada.
Ejemplo:
// Updated to be correct, thanks @Apocalisp
^foo.*(?<!bar)$
Debe coincidir con cualquier cosa que comience con "foo" y no termine con "bar".Conozco la sintaxis [^...], pero no puedo encontrar nada que haga eso para una cadena en lugar de caracteres individuales.
Estoy tratando específicamente de hacer esto para la expresión regular de Java, pero me he encontrado con esto antes, por lo que las respuestas para otros motores de expresiones regulares también serían geniales.
Gracias a @Kibbee por verificar que esto también funciona en C#.
Solución
Creo que en este caso quieres mirada atrás negativa, al igual que:
foo.*(?<!bar)
Otros consejos
Verificó la respuesta de @Apocalisp usando:
import java.util.regex.Pattern;
public class Test {
public static void main(String[] args) {
Pattern p = Pattern.compile("^foo.*(?<!bar)$");
System.out.println(p.matcher("foobar").matches());
System.out.println(p.matcher("fooBLAHbar").matches());
System.out.println(p.matcher("1foo").matches());
System.out.println(p.matcher("fooBLAH-ar").matches());
System.out.println(p.matcher("foo").matches());
System.out.println(p.matcher("foobaz").matches());
}
}
Esto genera las respuestas correctas:
false
false
false
true
true
true
No estoy familiarizado con las expresiones regulares de Java, pero sí con la documentación para Clase de patrón sugeriría que podría usar (?!X) para una búsqueda anticipada negativa de ancho cero que no captura (busca algo que no es X en esa posición, sin capturarlo como referencia inversa).Entonces podrías hacer:
foo.*(?!bar) // not correct
Actualizar:Apocalisp tiene razón, quieres una mirada atrás negativa.(estás comprobando que lo que coincide con el .* no termina en bar)
Como dijeron otros comentaristas, es necesario un análisis negativo.En Java puedes usar este patrón:
"^first_string(?!.?second_string)\\z"
- ^ - Asegura que la cadena comience con First_String
- \z - asegura que la cadena termine con second_string
- (?!.?segunda_cadena): significa que la primera_cadena no puede ir seguida de la segunda_cadena