Negando strings literais em uma expressão regular Java

votos
4

Então expressões regulares parecem corresponder na maior correspondência possível. Por exemplo:

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());
    }
}

gera saída

  1. ClarkRalphKentGuyGreenGardnerClarkSupermanKent

Gostaria que esta saída

  1. ClarkRalphKent
  2. ClarkSupermanKent

Eu tenho tentado padrões como:

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

que não funcionam, mas você vê o que eu estou tentando dizer. Quero que a seqüência de caracteres de Clark Kent para que não contém quaisquer ocorrências de Kent.

Esta string:

ClarkRalphKentGuyGreenGardnerBruceBatmanKent

deve gerar saída

  1. ClarkRalphKent
Publicado 09/12/2008 em 22:15
fonte usuário
Em outras línguas...                            


4 respostas

votos
6

gananciosos vs relutante é seu amigo aqui.

experimentar: Clark.+?Kent

Respondeu 09/12/2008 em 22:25
fonte usuário

votos
4

Você quer um "relutante" em vez de um quantificador "ganancioso". Basta colocar um? após o * deve fazer o truque.

Respondeu 09/12/2008 em 22:27
fonte usuário

votos
3

Quando você tentou "Clark[^((Kent)*)]Kent", eu acho que você estava querendo "Clark((?!Kent).)*Kent"para -largura de zero negativo look-ahead (desloque-se um pouco para a "Olhe-around Afirmações" cabeçalho).

Suportes especificar caracteres correspondente vs. correspondência padrão. Assim, o RegExp estava tentando encontrar um único caractere não em (, K, e, n, t, ), *.

Respondeu 09/12/2008 em 22:38
fonte usuário

votos
2

Use o relunctant ?sufixo: Clark.*?Kent os quantificadores ?, *, +pode ser seguido por ?indicar que eles devem parar o mais cedo possível.

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

Respondeu 09/12/2008 em 22:27
fonte usuário

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