Pergunta

Estou procurando um regex que corresponda a uma string que começa com uma substring e não termina com uma determinada substring.

Exemplo:

// Updated to be correct, thanks @Apocalisp
^foo.*(?<!bar)$

Deve corresponder a qualquer coisa que comece com “foo” e não termine com “bar”.Eu sei sobre a sintaxe [^...], mas não consigo encontrar nada que faça isso para uma string em vez de caracteres únicos.

Estou tentando fazer isso especificamente para o regex do Java, mas já me deparei com isso antes, então respostas para outros mecanismos de regex também seriam ótimas.

Obrigado ao @Kibbee por verificar se isso também funciona em C#.

Foi útil?

Solução

Eu acho que neste caso você quer olhar negativo para trás, igual a:

foo.*(?<!bar)

Outras dicas

Resposta verificada do @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());
  }
}

Esta saída dá as respostas certas:

false
false
false
true
true
true

Não estou familiarizado com Java regex, mas com documentação para o Classe padrão sugeriria que você pudesse usar (?!X) para um lookahead negativo de largura zero sem captura (procura algo que não é X naquela posição, sem capturá-lo como uma referência anterior).Então você poderia fazer:

foo.*(?!bar) // not correct

Atualizar:O Apocalipse está certo, você quer uma visão negativa do passado.(você está verificando se o que .* corresponde não termina com barra)

Como outros comentaristas disseram, você precisa de uma visão negativa.Em Java você pode usar este padrão:

"^first_string(?!.?second_string)\\z"
  • ^ - garante que a string comece com First_String
  • \z - garante que a string termine com second_string
  • (?!.?second_string) - significa que first_string não pode ser seguido por second_string
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top