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

question facile cette fois.

j'essaie de tester si oui ou non 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 apparaître, mais qui ne semble pas fonctionner.

par exemple,

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

et

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

les deux retourne true (je m'attends à false).

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

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

aussi, j'utilise .NET, donc gardez ça à l'esprit.

Edit1:

j'ai trouvé ce , mais il ne semble pas répondre à la question que je vais avoir.

Edit2:

je voulais répondre à Kevin et Joel suggestions. Ces suggestions seraient en effet plus rapides, mais elles n'accomplissent pas la flexibilité dont j'ai besoin dans ce cas, donc si vous avez trouvé cette question par la recherche, certainement regarder pour voir si leurs réponses correspondront à vos besoins. Dans mon cas, l'expression régulière est passée à une méthode de validation DataTable qui boucle à travers chaque ligne et vérifie que le contenu de cette rangée dans une colonne spécifique corresponde à la RegEx dans laquelle on passe. Puisque je vais réutiliser cette méthode pour plusieurs autres datables qui sont en cours de validation, je voulais:

  1. utiliser Regex pour permettre la plus large gamme de validations, et
  2. toujours rechercher une correspondance positive (i.e. au lieu d'utiliser !Regex.IsMatch (cell, regexvariable), j'ai toujours voulu pouvoir utiliser Regex.IsMatch(cellule, regexvariable) étant donné que la majorité des données invoquant cette méthode utiliseront la correspondance positive au lieu de la correspondance négative.

J'espère que ça aidera.

33
demandé sur Community 2008-10-13 23:43:06

6 réponses

votre solution est à moitié juste. Le match que vous voyez est pour les autres personnages. Ce que tu veux dire c'est quelque chose comme "Hé! Je ne veux pas voir ce personnage dans la chaîne entière".

dans ce cas vous faites:

Regex.IsMatch("103","^[^0]*$")
51
répondu Jorge Ferreira 2008-10-13 19:45:27

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

16
répondu Ken Paul 2008-10-13 19:53:54

si vous cherchez un seul caractère dans une chaîne, regex semble un peu exagéré. Pourquoi ne pas simplement utiliser .IndexOf ou .Contient ?

7
répondu Kevin 2008-10-13 19:46:19

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

4
répondu stephenbayer 2008-10-13 19:45:44

vous mettez votre négation au mauvais endroit. [^x] correspond à tout ce qui n'est pas x. Si x est dans la chaîne, la chaîne correspond à l'expression si il y a d'autres personnages. Au lieu de cela, vous voulez faire correspondre true si x est là, et ensuite nier le résultat de la fonction:

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

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

pas que, avec ces exemples simples, la chaîne normale.IndexOf () ou String.Contient du (de la) serait un meilleur choix.

2
répondu Joel Coehoorn 2008-10-13 19:47:52

je suis tombé sur cette question à la recherche de la même chose que JavaScript. L'expression ci-dessus n'a pas fonctionné dans mon cas, mais je suis tombé sur l'expression ci-dessous qui a fait. (Juste au cas où quelqu'un d'autre cherche une solution JavaScript se retrouve ici aussi.)

^(?!0).) * $ 151910920"

2
répondu Brett 2010-03-23 20:24:55