Dominando Regex: Como Correspondência de uma String que Começa com um Substring e Não Termina com Outro
Regex (expressões regulares) são ferramentas incrivelmente poderosas para processamento de texto e correspondência de padrões. Seja você um desenvolvedor experiente ou esteja apenas começando, entender como aproveitar as capacidades do regex pode economizar muito tempo e esforço. Neste artigo, nos concentraremos em um problema específico: criar um padrão de regex que corresponda a uma string que começa com um determinado substring e não termina com outro.
O Problema
Suponha que você queira validar strings em sua aplicação. Você precisa garantir que:
- A string deve começar com um substring específico, digamos
"foo"
. - A string não deve terminar com outro substring, por exemplo,
"bar"
.
Por exemplo, correspondências válidas incluiriam:
foo123
foolish
foo
Enquanto correspondências inválidas pareceriam:
foobar
foo bar
Isso pode ser complicado, especialmente se você estiver usando regex em Java ou em qualquer outra linguagem de programação que adere a uma sintaxe regex semelhante.
A Solução
Para alcançar isso, podemos utilizar asserções de lookbehind negativas em regex. Lookbehinds permitem que especifiquemos que um certo elemento (neste caso, o final da string) não deve seguir o substring designado.
Construindo o Padrão Regex
Para o nosso cenário específico, podemos definir nosso padrão regex da seguinte forma:
foo.*(?<!bar)$
Análise do Padrão
foo
: O padrão começa com os caracteres literais “foo”..*
: O ponto.
corresponde a qualquer caractere (exceto um terminador de linha) e o asterisco*
significa zero ou mais ocorrências desse caractere.(?<!bar)
: Esta é a asserção de lookbehind negativa. Ela verifica que a string não termina com “bar”.$
: Isto afirma que estamos no final da linha ou string.
Pontos Chave para Lembrar
- Lookbehind Negativa: Este recurso regex permite que você configure condições com base no que NÃO está presente no final da string.
- Portabilidade: O padrão regex fornecido funciona efetivamente em Java e foi verificado para funcionar na linguagem C# também.
Exemplo de Uso em Java
Veja como você pode usar esse regex em um programa Java:
import java.util.regex.*;
public class RegexExample {
public static void main(String[] args) {
String regex = "foo.*(?<!bar)$";
String[] testStrings = { "foobar", "foo123", "foolish", "foo bar" };
for (String testString : testStrings) {
if (Pattern.matches(regex, testString)) {
System.out.println(testString + " corresponde.");
} else {
System.out.println(testString + " não corresponde.");
}
}
}
}
Conclusão
Entender como manipular regex para corresponder a strings com base em condições específicas permite que você implemente validações mais eficazes em suas aplicações. Ao empregar lookbehind negativo, você pode garantir que suas strings atendam aos critérios desejados sem serem prejudicadas por finais indesejados.
Deixe seu conhecimento de regex fortalecer suas práticas de codificação, e você se verá simplificando muitas tarefas complexas de resolução de problemas em sua jornada de desenvolvimento de software.