Probleme de regex
Bonjour,
je souhaite pouvoir filtrer un chaine de caractère en fonction de certains caractères mais le code que j'ai fait ne fonctionne pas:
ce code m'affiche "ok" car $chaine1 contient un "e" mais ne contient ni de "t" ni de "r"
Comment vérifier si ma chaine contient bien un "t" un "e" et un "r" sachant que ces caractères sont entré par un utilisateur, donc on ne les connait pas à l’avance.
Merci
je souhaite pouvoir filtrer un chaine de caractère en fonction de certains caractères mais le code que j'ai fait ne fonctionne pas:
#!/bin/bash test1='ter' chaine1='pole' if [[ $chaine1 =~ [$test1]+ ]] then echo 'ok' else echo 'ko' fi
ce code m'affiche "ok" car $chaine1 contient un "e" mais ne contient ni de "t" ni de "r"
Comment vérifier si ma chaine contient bien un "t" un "e" et un "r" sachant que ces caractères sont entré par un utilisateur, donc on ne les connait pas à l’avance.
Merci
A voir également:
- Probleme de regex
- Regex buddy - Télécharger - Édition & Programmation
- Regex tout sauf - Forum Java
- Regex ne commence pas par ✓ - Forum Programmation
- Regex mot de passe ✓ - Forum Framework .NET
- Regex pour evitez la répétition des caractères - Forum PHP
1 réponse
Bonjour,
Ce code m'affiche "ok" car
Plus exactement, ce code affiche "ok" car
Comment vérifier si ma chaine contient bien un "t" un "e" et un "r" sachant que ces caractères sont entré par un utilisateur, donc on ne les connait pas à l’avance.
Tu ne peux pas le faire comme ça, car ça va à l'encontre même de ce qu'une expression rationnelle représente. Une expression rationnelle est une écriture pratique permettant en pratique d'implémenter un automate fini déterministe, par définition sans mémoire. Dans ton cas, le test que tu veux faire requiert une mémoire (quelles lettres de
La manière la plus simple (mais pas la plus efficace) de l'écrire en bash consiste à itérer sur chaque caractère de
Pour moi bash n'est pas très pratique pour répondre à ce problème, je me tournerais plutôt vers un langage un peu plus évolué, comme par exemple python, qui permet de facilement transformer une chaîne en un ensemble de lettre et faire des tests d'inclusion.
Bonne chance
Ce code m'affiche "ok" car
$chaine1contient un "e" mais ne contient ni de "t" ni de "r"
Plus exactement, ce code affiche "ok" car
$chaine1contient une sous chaîne constitué d'au moins une lettre parmi t, e, r (en l'occurrence la sous-chaîne "e").
Comment vérifier si ma chaine contient bien un "t" un "e" et un "r" sachant que ces caractères sont entré par un utilisateur, donc on ne les connait pas à l’avance.
Tu ne peux pas le faire comme ça, car ça va à l'encontre même de ce qu'une expression rationnelle représente. Une expression rationnelle est une écriture pratique permettant en pratique d'implémenter un automate fini déterministe, par définition sans mémoire. Dans ton cas, le test que tu veux faire requiert une mémoire (quelles lettres de
$test1) ont été effectivement rencontrées au moins une fois.
La manière la plus simple (mais pas la plus efficace) de l'écrire en bash consiste à itérer sur chaque caractère de
$test1, et vérifier avec
grepsi
$chaine1le contient. Dès qu'on échoue, on arrête et on retourne "nok". Si on parvient à trouver toutes les lettres avec succès, on renvoie "ok".
Pour moi bash n'est pas très pratique pour répondre à ce problème, je me tournerais plutôt vers un langage un peu plus évolué, comme par exemple python, qui permet de facilement transformer une chaîne en un ensemble de lettre et faire des tests d'inclusion.
test1 = "ter" chaine1 = "pole" print("ok" {a for a in test1} <= {a for a in chaine1} else "nok")
Bonne chance