2010-11-08 5 views
48

J'ai besoin d'une regex qui ne trouvera que des correspondances où la chaîne entière correspond à ma requête. Par exemple, si je fais une recherche de films avec le nom "Red October", je veux juste faire correspondre sur ce titre exact (insensible à la casse), mais ne correspond pas à des titres comme "The Hunt For Red October". Je ne suis pas sûr de savoir comment faire cela. Quelqu'un sait?Comment reconnaître une chaîne entière avec une regex?

Merci!

+1

Pourquoi avez-vous besoin d'une regex pour quelque chose qu'un simple 'string.Contains' fonctionnera? – Oded

+0

La raison pour laquelle je dois utiliser une regex est que je l'utilise pour une recherche dans MongoDB et je dois le faire pour être insensible à la casse qui ne peut être fait avec une regex – Micah

+0

Pourquoi ne pas convertir (à la volée) les données db à minuscules et minuscules de l'utilisateur pour la recherche? – greenoldman

Répondre

73

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.

1

Désolé, mais c'est un peu flou. De ce que j'ai lu, vous voulez faire une simple comparaison de chaînes. 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()); 
+0

La raison pour laquelle je dois utiliser une regex est que je l'utilise pour une recherche dans MongoDB et je dois le faire pour être insensible à la casse qui ne peut être fait avec une regex. – Micah

8

Vous devez joindre votre regex en ^ (début de la chaîne) et $ (fin de chaîne):

^Red October$ 
14

Utilisez les modificateurs ^ et $ pour indiquer où le motif regex se situe 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 
23

En général, et avec les paramètres par défaut, ^ et $ Les ancres sont une bonne façon de s'assurer qu'une regex correspond à une chaîne entière.

Quelques mises en garde, cependant:

Si vous avez alternance dans votre regex, assurez-vous de joindre votre regex dans un groupe non-capture avant d'entourer ^ et $:

^foo|bar$ 

est- bien sûr différent de

^(?:foo|bar)$ 

en outre, ^ et peut $ prendre une signification différente (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 qui prennent en charge les expressions régulières, il s'agit généralement du comportement par défaut. Dans certaines langues, en particulier Ruby, ce comportement ne peut même pas être désactivé.

Par conséquent, il est une autre série de points d'ancrage qui sont garantis pour seul match au début/fin de la chaîne entière:

\A matchs au début de la chaîne. Correspond à la fin de la chaîne ou avant un saut de ligne final.

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

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

+2

c'est la réponse la plus utile –

2

Je sais que c'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 plus simple:

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

correspondant à la chaîne entière peut être fait avec ^ et $ comme dit dans les réponses précédentes. Pour rendre la casse de la regex insensible, vous pouvez implémenter un hack impliquant des classes de caractères.

Un lot des classes de caractères.

^[Rr][Ee][Dd] [Oo][Cc][Tt][Oo][Bb][Ee][Rr]$ 
-1

Vous pouvez le faire comme ça si je veux Exemple seulement pour attraper une fois la lettre moins un dans une chaîne et il peut être vérifier avec myRegex.IsMatch()

^[^ e] [e] {1} [^ e] $

Questions connexes