Dominando Regex: Cómo Hacer Coincidir una Cadena que Comienza con una Subcadena y No Termina con Otra
Regex (expresiones regulares) son herramientas increíblemente poderosas para el procesamiento de texto y la coincidencia de patrones. Ya seas un desarrollador experimentado o estés comenzando, entender cómo aprovechar las capacidades de regex puede ahorrarte mucho tiempo y esfuerzo. En este artículo, nos enfocaremos en un problema específico: crear un patrón regex que coincida con una cadena que comienza con una cierta subcadena y no termina con otra.
El Problema
Supongamos que quieres validar cadenas en tu aplicación. Necesitas asegurarte de que:
- La cadena debe comenzar con una subcadena específica, digamos
"foo"
. - La cadena no debe terminar con otra subcadena, por ejemplo,
"bar"
.
Por ejemplo, coincidencias válidas incluirían:
foo123
foolish
foo
Mientras que coincidencias inválidas se verían como:
foobar
foo bar
Esto puede ser complicado, especialmente si estás utilizando regex en Java o en cualquier otro lenguaje de programación que siga una sintaxis de regex similar.
La Solución
Para lograr esto, podemos utilizar aserciones de lookbehind negativo en regex. Los lookbehinds nos permiten especificar que un cierto elemento (en nuestro caso, el final de la cadena) no debe seguir a la subcadena designada.
Construyendo el Patrón Regex
Para nuestro escenario específico, podemos definir nuestro patrón regex de la siguiente manera:
foo.*(?<!bar)$
Desglose del Patrón
foo
: El patrón comienza con los caracteres literales “foo”..*
: El punto.
coincide con cualquier carácter (excepto un terminador de línea) y el asterisco*
significa cero o más ocurrencias de ese personaje.(?<!bar)
: Esta es la aserción de lookbehind negativo. Verifica que la cadena no termine con “bar”.$
: Esto afirma que estamos al final de la línea o cadena.
Puntos Clave para Recordar
- Lookbehind Negativo: Esta característica de regex te permite configurar condiciones basadas en lo que NO está presente al final de la cadena.
- Portabilidad: El patrón regex proporcionado funciona de manera efectiva en Java y se ha verificado que también funciona en el lenguaje C#.
Ejemplo de Uso en Java
Aquí hay un ejemplo de cómo podrías usar este regex en un 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 + " coincide.");
} else {
System.out.println(testString + " no coincide.");
}
}
}
}
Conclusión
Entender cómo manipular regex para hacer coincidir cadenas basadas en condiciones específicas te permite implementar validaciones más efectivas en tus aplicaciones. Al emplear lookbehind negativo, puedes asegurarte de que tus cadenas cumplan con los criterios deseados sin ser obstaculizadas por finales no deseados.
Deja que tu conocimiento de regex potencie tus prácticas de codificación y te encontrarás simplificando muchas tareas complejas de resolución de problemas en tu camino de desarrollo de software.