35 votes

RegEx pour savoir si une chaîne de caractères ne contient pas un caractère spécifique

Question facile cette fois.

J'essaie de tester si une chaîne de caractères ne contient pas un caractère en utilisant des expressions régulières. Je pensais que l'expression était de la forme "[^]". x ]" où x est le personnage que vous ne voulez pas voir apparaître, mais ça n'a pas l'air de fonctionner.

Par exemple,

Regex.IsMatch("103","[^0]")

et

Regex.IsMatch("103&","[^&]")

Les deux retournent vrai (je m'attendrais à ce que ce soit faux).

J'ai commencé à utiliser "[^&]" et j'ai pensé que peut-être le & devait être échappé en tant que \&, mais cela ne semblait pas faire de différence.

Des idées ? Je suppose que c'est quelque chose de petit.

De plus, j'utilise .NET, alors gardez cela à l'esprit.

Edit1 :

J'ai trouvé este mais cela ne semble pas répondre au problème que je rencontre.

Edit2 :

Je voulais répondre à Kevin y Joel Les suggestions de la Commission. Ces suggestions seraient en effet plus rapides, mais elles n'apportent pas la flexibilité dont j'ai besoin dans ce cas, donc si vous avez trouvé cette question par le biais d'une recherche, regardez définitivement si leurs réponses répondent à vos besoins. Dans mon cas, l'expression régulière est transmise à une méthode de validation DataTable qui boucle sur chaque ligne et vérifie que le contenu de cette ligne dans une colonne spécifique correspond à l'expression régulière transmise. Comme je vais réutiliser cette méthode pour plusieurs autres DataTables à valider, je voulais.. :

  1. Utilisez Regex pour permettre la plus large gamme de validations, et
  2. Toujours rechercher une correspondance positive (c'est-à-dire qu'au lieu d'utiliser !Regex.IsMatch(cell, regexvariable), je voulais m'appuyer sur le fait de toujours pouvoir utiliser Regex.IsMatch(cell, regexvariable) puisque la majorité des DataTables invoquant cette méthode utiliseront la correspondance positive au lieu de la négative.

J'espère que cela vous aidera.

0 votes

Si vous ne vérifiez que la présence d'un seul caractère, vous pouvez vous en sortir beaucoup mieux sans regex. Kevin a raison : utilisez .IndexOf() ou quelque chose de plus simple. Ce sera plus lisible, plus clair et plus rapide.

53voto

smink Points 39640

Votre solution est à moitié correcte. La correspondance que vous voyez est pour les autres caractères. Ce que vous voulez dire, c'est quelque chose comme "hé ! je ne veux pas voir ce caractère dans toute la chaîne".

Dans ce cas, vous le faites :

Regex.IsMatch("103","^[^0]*$")

0 votes

Merci. J'ai également essayé "^[^0]$", mais j'ai abandonné les ^ et les $, car ils provoquaient une évaluation fausse de toutes les données. Merci encore. Mes "deux problèmes" sont maintenant résolus.

4 votes

Je suppose que !Regex.IsMatch("103", "0") serait plus rapide en fait.

0 votes

J'utilise ça, je ne veux pas voir de caractères ? , [ y ] J'ai essayé. ^[^?]*$ qui a travaillé pour ? sur la base de l'exemple ci-dessus, mais lorsque j'ajoute les caractères entre parenthèses, cela ne fonctionne pas... ^[^?[]]*$

17voto

Ken Paul Points 2398

Le motif [^0] correspond à tout caractère qui n'est pas un zéro. Dans vos deux exemples, le motif correspond au premier caractère ("1"). Pour tester si la chaîne entière ne contient pas de zéros, le motif devrait être "^[^0]*$". Cela se lit comme suit : Commencez par le début de la chaîne, faites correspondre un nombre arbitraire de caractères qui ne sont pas des zéros, suivis immédiatement par la fin de la chaîne. Toute chaîne contenant un zéro échoue. Toute chaîne ne contenant aucun zéro est acceptée.

7voto

Kevin Points 2548

Si vous recherchez un seul caractère dans une chaîne de caractères, les regex semblent un peu exagérées. Pourquoi ne pas simplement utiliser .IndexOf ou .Contains ?

0 votes

Cela pourrait fonctionner, mais j'essaie d'écrire un validateur DataTable utilisant des décorateurs et je voulais une méthode qui me permette d'étendre à d'autres correspondances de chaînes (qu'elles soient inclusives ou exclusives).

4voto

stephenbayer Points 5548

Le premier caractère atteint par l'analyseur est "1", ce qui est vrai pour [^0] et également vrai pour [^&], donc il retournera vrai dans ces deux exemples.

2voto

Joel Coehoorn Points 190579

Tu mets ta négation au mauvais endroit. [^x] correspondra à tout ce qui n'est pas x. Si x est dans la chaîne, la chaîne correspond toujours à l'expression s'il y a également d'autres caractères. Au lieu de cela, vous voulez que l'expression corresponde à true si x est présent, et ensuite nier le résultat de la fonction :

Not Regex.IsMatch("103", "0")

Not Regex.IsMatch("103&", "&")

Non pas qu'avec ces exemples simples, la méthode normale String.IndexOf() ou String.Contains() serait un meilleur choix.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X