c# - palabra - probar expresiones regulares
Regex para que coincida con algo que no sea una subcadena especĂfica (4)
Estoy buscando una expresión regular que coincida con una cadena que comienza con una subcadena y no termina con una cierta subcadena.
Ejemplo:
// Updated to be correct, thanks @Apocalisp
^foo.*(?<!bar)$
Debe coincidir con cualquier cosa que comience con "foo" y no termine con "bar". Sé sobre la sintaxis [^ ...], pero no puedo encontrar nada que haga eso para una cadena en lugar de caracteres individuales.
Estoy específicamente tratando 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 #.
Como dijeron otros comentaristas, necesitas una anticipación negativa. En Java puedes usar este patrón:
"^first_string(?!.?second_string)//z"
- ^ - asegura que la cadena comienza con first_string
- / z - asegura que la cadena termina con second_string
- (?!.? second_string) - significa que first_string no puede ser seguido por second_string
Creo que en este caso quieres mirar hacia atrás negativamente , así:
foo.*(?<!bar)
La respuesta de Verified @ 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());
}
}
Este resultado es la respuesta correcta:
false
false
false
true
true
true
No estoy familiarizado con Java regex, pero la documentación para Pattern Class sugiere que podrías usar (?! X) para un lookahead negativo de ancho cero sin captura (busca algo que no sea X en esa postisión, sin capturarlo). como retroreferencia). Entonces podrías hacer:
foo.*(?!bar) // not correct
Actualización : derecho de Apocalisp, quieres un aspecto negativo detrás. (está comprobando que lo que el. * coincide no termina con la barra)