web-dev-qa-db-fra.com

Comment faire correspondre une chaîne entière avec un regex?

J'ai besoin d'une expression régulière qui ne trouvera des correspondances que lorsque la chaîne entière correspond à ma requête.

Par exemple, si je recherche des films portant le nom "Octobre rouge", je souhaite uniquement faire correspondre ce titre (sans distinction de casse), mais pas avec des titres tels que "The Hunt For Red October". Pas tout à fait sûr de savoir comment faire ça. Quelqu'un sait?

Merci!

57
Micah

Essayez l'expression régulière suivante:

^Red October$

Par défaut, les expressions régulières sont sensibles à la casse. Le ^ marque le début du texte correspondant et $ la fin.

84

En règle générale, et avec les paramètres par défaut, les ancres ^ et $ sont un bon moyen de s’assurer qu’une regex correspond à une chaîne entière.

Quelques mises en garde, cependant:

Si vous avez l'alternance dans votre expression rationnelle, assurez-vous de l'enfermer dans un groupe sans capture avant de l'entourer avec ^ et $:

^foo|bar$

est bien sûr différent de 

^(?:foo|bar)$

De plus, ^ et $ peuvent prendre un sens différent (début/fin de ligne au lieu de début/fin de chaîne ) si certaines options sont définies. Dans les éditeurs de texte prenant en charge les expressions régulières, il s'agit généralement du comportement par défaut. Dans certaines langues, notamment Ruby, ce comportement ne peut même pas être désactivé. 

Par conséquent, il existe un autre ensemble d'ancres dont la correspondance est garantie uniquement au début/à la fin de la chaîne complète:

\A correspond au début de la chaîne.

\Z correspond à la fin de la chaîne ou avant un dernier saut de ligne.

\z correspond à la toute fin de la chaîne.

Mais toutes les langues ne prennent pas en charge ces ancres, notamment JavaScript.

29
Tim Pietzcker

Utilisez les modificateurs ^ et $ pour indiquer l'emplacement du motif regex par rapport au début et à la fin de la chaîne:

Regex.Match("Red October", "^Red October$"); // pass
Regex.Match("The Hunt for Red October", "^Red October$"); // fail
16
Tim Robinson

Vous devez inclure votre expression rationnelle dans ^ (début de chaîne) et $ (fin de chaîne):

^Red October$
8
Anton Gogolev

Je sais qu'il est peut-être un peu tard pour répondre à cette question, mais peut-être que ce sera utile pour quelqu'un d'autre.

Manière la plus simple:

var someString = "...";
var someRegex = "...";
var match = Regex.Match(someString , someRegex );
if(match.Success && match.Value.Length == someString.Length){
    //pass
} else {
    //fail
}
3
Zixav

Désolé, mais ce n'est pas clair.

D'après ce que j'ai lu, vous voulez comparer des chaînes simples. Vous n'avez pas besoin de regex pour ça.

string myTest = "Red October";
bool isMatch = (myTest.ToLower() == "Red October".ToLower());
Console.WriteLine(isMatch);
isMatch = (myTest.ToLower() == "The Hunt for Red October".ToLower());
1
Dean Thomas

La correspondance de la chaîne entière peut être faite avec ^ et $ comme indiqué dans les réponses précédentes.

Pour rendre la regex insensible à la casse, vous pouvez implémenter un hack impliquant des classes de caractères. Un beaucoup de classes de personnages.

^[Rr][Ee][Dd] [Oo][Cc][Tt][Oo][Bb][Ee][Rr]$
0
dorukayhan