Je fais un projet en C # qui comprend la table et la gestion des utilisateurs. Dans ma zone de texte de contrôle personnalisée, je dois valider si l'utilisateur introduit un DNI espagnol valide ou non. Le format DNI est 8 numéros et 1 lettre. La méthode a pour effet de ne pas écrire si l'utilisateur tape plus de 8 numéros ou plus d'une lettre dans cet ordre (12345678A). Si quelqu'un pouvait aider, je serais très reconnaissant! Merci de la lecture.
J'ai essayé cette méthode d'expressions régulières, mais cela ne fonctionne pas. P>
private void ValidateText(object sender, KeyPressEventArgs e) { string pattern = @"^((\d{8})|(\d{8}([A-Z]|[a-z])))$"; Regex r = new Regex(pattern); if ((r.IsMatch(this.Text))) { e.Handled = true; } }
3 Réponses :
Vous n'avez pas besoin d'utiliser une regex pour une règle aussi simple. Utilisez cette méthode ci-dessous
public static bool ValidateSpanishDNI(string value) { if(value == null) return false; if(value.Length != 9) return false; if(char.IsLetter(value[8]) == false) return false; for(int i = 0; i < 8; i++) { if(char.IsDigit(value[i]) == false) return false; } return true; }
Ce code vérifie si le dernier caractère est un chiffre et que les autres sont des lettres, mais l'OP veut le contraire.
Voici une solution alternative utilisant LINQ.
string value = this.Text; int outInt = 0; int numbersCount = value.Count(c => Char.IsNumber(c)); e.Handled = ( (numbersCount == 8) && (value.Length - numbersCount == 1) && !(int.TryParse(value[value.Length - 1].ToString(), out outInt)) );
Je ne vois pas comment cela vérifie que la chaîne se termine i> dans une lettre.
Oui juste enlevé :)
Y a-t-il une telle exigence? Oh, je viens de remarquer. Je vais mettre à jour cela.
Oui. "DNI (Documento Nacional de Identidad): Il s'agit du numéro d'identification des citoyens espagnols. Le format DNI est de 8 chiffres suivis d'une lettre (par exemple 12345678a). Le même numéro est utilisé pour son permis de conduire." source
Mise à jour de la réponse.
Qu'en est-il de votre expression régulière ne fonctionne pas? J'ai utilisé votre expression régulière exacte dans DotNetfiddle et il semble fonctionner très bien. P>
Il y a quelques choses à noter: p>
12345678a code> et a12345678 code>. Est-ce votre intention? LI>
- Vous n'avez pas besoin de faire
[A-Z] | [A-Z] code>. Vous pouvez simplement utiliser [a-za-z] code> et il fonctionnera (comme indiqué ci-dessous. Li>
ul>
modèle de chaîne = @ "^ (((((a-za-z]) \ d {8}) | (\ d {8} ([A-ZA-Z]))) $"; code> p>
S'il vous plaît voir cet exemple dérivé de votre code comme référence et laissez-moi savoir si vous avez des questions! P>
Est-ce que cela répond à votre question? Référence - Que signifie cette regex?
Après la modification, le regex vérifie maintenant si la chaîne est de 8 chiffres ou 8 chiffres suivis d'une lettre de la gamme AZ, mais pas, dites, Ñ, et inclut K et W, qui ne sont pas dans l'alphabet espagnol naturel ( Bien que inclus dans beaucoup de mots de prêt).