Negar cadenas literales en una expresión regular de Java

votos
4

Así que las expresiones regulares parecen coincidir en la coincidencia más larga posible. Por ejemplo:

public static void main(String[] args) {
    String s = ClarkRalphKentGuyGreenGardnerClarkSupermanKent;
    Pattern p = Pattern.compile(Clark.*Kent, Pattern.CASE_INSENSITIVE);
    Matcher myMatcher = p.matcher(s);
    int i = 1;
    while (myMatcher.find()) {
        System.out.println(i++ + .  + myMatcher.group());
    }
}

genera salida

  1. ClarkRalphKentGuyGreenGardnerClarkSupermanKent

Me gustaría esta salida

  1. ClarkRalphKent
  2. ClarkSupermanKent

He estado probando Patrones como:

 Pattern p = Pattern.compile(Clark[^((Kent)*)]Kent, Pattern.CASE_INSENSITIVE);

eso no funciona, pero ves lo que trato de decir. Quiero la secuencia de Clark a Kent que no contenga ninguna ocurrencia de Kent.

Esta cadena:

ClarkRalphKentGuyGreenGardnerBruceBatmanKent

debe generar salida

  1. ClarkRalphKent
Publicado el 09/12/2008 a las 22:15
fuente por usuario
En otros idiomas...                            


4 respuestas

votos
6

codicioso vs reacio es tu amigo aquí.

tratar: Clark.+?Kent

Respondida el 09/12/2008 a las 22:25
fuente por usuario

votos
4

Desea un cuantificador "reacio" en lugar de un "codicioso". Simplemente poniendo un? después de tu * debería hacer el truco.

Respondida el 09/12/2008 a las 22:27
fuente por usuario

votos
3

Cuando intentó "Clark[^((Kent)*)]Kent", creo que faltaban "Clark((?!Kent).)*Kent"para el ancho de cero negativo de preanálisis (desplazarse un poco al "mirar a los lados aserciones" de cabecera).

Los corchetes especifican la coincidencia de caracteres con la coincidencia de patrones. Entonces, el RegExp estaba tratando de encontrar un único personaje que no estuviera (, K, e, n, t, ), *.

Respondida el 09/12/2008 a las 22:38
fuente por usuario

votos
2

Usar la relunctant ?sufijo: Clark.*?Kent Los cuantificadores ?, *, +pueden ser seguidos por ?indicar que deberían dejar tan pronto como sea posible.

ver http://perldoc.perl.org/perlre.html

Respondida el 09/12/2008 a las 22:27
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more