Maîtriser les Regex : Comment correspondre à une chaîne qui commence par une sous-chaîne et ne se termine pas par une autre
Les regex (expressions régulières) sont des outils incroyablement puissants pour le traitement de texte et la correspondance de motifs. Que vous soyez un développeur chevronné ou que vous débutiez, comprendre comment exploiter les capacités des regex peut vous faire gagner beaucoup de temps et d’efforts. Dans cet article, nous allons nous concentrer sur un problème spécifique : créer un motif regex qui correspond à une chaîne qui commence par une certaine sous-chaîne et ne se termine pas par une autre.
Le Problème
Supposons que vous souhaitiez valider des chaînes dans votre application. Vous devez vous assurer que :
- La chaîne doit commencer par une sous-chaîne spécifique, disons
"foo"
. - La chaîne ne doit pas se terminer par une autre sous-chaîne, par exemple
"bar"
.
Par exemple, des correspondances valides incluraient :
foo123
foolish
foo
Tandis que des correspondances invalides ressembleraient à :
foobar
foo bar
Cela peut être délicat, surtout si vous utilisez des regex en Java ou dans tout autre langage de programmation qui adhère à une syntaxe regex similaire.
La Solution
Pour parvenir à cela, nous pouvons utiliser les assertions de lookbehind négatif dans les regex. Les lookbehinds nous permettent de spécifier qu’un certain élément (dans notre cas, la fin de la chaîne) ne doit pas suivre la sous-chaîne désignée.
Construction du Motif Regex
Pour notre scénario spécifique, nous pouvons définir notre motif regex comme suit :
foo.*(?<!bar)$
Décomposition du Motif
foo
: Le motif commence par les caractères littéraux “foo”..*
: Le point.
correspond à n’importe quel caractère (sauf un terminator de ligne) et l’astérisque*
signifie zéro ou plusieurs occurrences de ce caractère.(?<!bar)
: Ceci est l’assertion de lookbehind négatif. Elle vérifie que la chaîne ne se termine pas par “bar”.$
: Ceci affirme que nous sommes à la fin de la ligne ou de la chaîne.
Points Clés à Retenir
- Lookbehind Négatif : Cette fonctionnalité regex vous permet de configurer des conditions basées sur ce qui n’est PAS présent à la fin de la chaîne.
- Portabilité : Le motif regex fourni fonctionne efficacement en Java et a été vérifié pour fonctionner également dans le langage C#.
Utilisation d’Exemple en Java
Voici comment vous pourriez utiliser cette regex dans un programme 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 + " correspond.");
} else {
System.out.println(testString + " ne correspond pas.");
}
}
}
}
Conclusion
Comprendre comment manipuler les regex pour correspondre à des chaînes en fonction de conditions spécifiques vous permet de mettre en œuvre des validations plus efficaces dans vos applications. En employant le lookbehind négatif, vous pouvez vous assurer que vos chaînes respectent les critères souhaités sans être freinées par des terminaisons indésirables.
Laissez vos connaissances en regex renforcer vos pratiques de codage, et vous vous retrouverez à simplifier de nombreuses tâches de résolution de problèmes complexes dans votre parcours de développement logiciel.