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#.

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top