2009-06-08 6 views
0

Quel mécanisme d'expression régulière peut-on utiliser pour "ski" mais pas "ski nautique"?quel mécanisme d'expression régulière correspond à "ski" mais pas "ski nautique"?

Ou, match "ski" mais pas "vente de ski"?

Une brève explication peut-elle être incluse?

Mise à jour: Je veux dire, par exemple, il devrait pouvoir correspondre à "2009 compétition de ski", mais pas "2009 compétition de ski nautique".

+3

Quels mots devraient et ne devraient pas correspondre? Vous ne voulez pas de «vente de ski» mais pourquoi la «compétition de ski» est-elle acceptable? Quels sont vos critères d'exclusion? –

+0

c'est juste un exemple. Supposons que je veux trouver toutes les chaînes dans un document qui a le mot ski, mais je sais que je ne suis pas intéressé par "vente de ski". –

Répondre

11

Pour la pièce mise à jour, vous devez utiliser le look-behind négatif. Quelque chose comme

(?<!water\s*)(ski\b) 

Cela devrait correspondre au mot ski, où l'eau n'est pas le mot précédent.

EDIT: J'ai modifié l'expression rationnelle ci-dessus, et je voulais dire rétrograde négatif, pas référence arrière. Pour les compétitions de ski et de ski, mais pas pour la vente de ski, vous avez besoin d'une anticipation négative. .: par exemple

(\bski)(?!\s*sale) 

Voir http://www.regular-expressions.info/lookaround.html pour plus d'explications.

+0

La plupart des moteurs regex qui prennent en charge lookbehind ne prennent pas en charge la recherche de longueur variable, donc il est peu probable que le \ s * fonctionne. – ysth

+0

Cela fonctionne sur .NET. Voir http://www.regular-expressions.info/refflavors.html. Si l'OP veut des réponses pour un moteur spécifique, il devrait le dire. –

+0

La plupart des moteurs regex qui prennent en charge lookbehind DO prennent en charge la recherche de longueur variable - une fois qu'il y a une largeur maximale évidente. Donc, une solution de contournement à \ s * consiste à utiliser \ s {0,100} à la place (ou simplement augmenter la valeur de 100 à ce qui est une valeur sûre). –

0

Vous pouvez toujours faire une recherche multi-passes d'abord retirer toutes les instances de vente de ski nautique et de ski de la chaîne puis faire l'IsMatch sur cela. En C# cela ressemblerait à ceci.

string line = Console.ReadLine(); 
line = Regex.Replace(line, "water ski", ""); 
line = Regex.Replace("ski sale", ""); 
bool matchFound = line.IsMatch("ski"); 
Questions connexes