2010-06-17 6 views
16

Les caractères autorisés sont (au moins) A-Z, a-z, 0-9, ö, Ö, ä, ä, å, Å et allemand, letton, estonien (le cas échéant) caractères spéciaux? Existe-t-il une méthode prête à l'emploi ou dois-je faire des listes noires (caractères non autorisés) et des expressions régulières IsMatch? Si non prêt à l'emploi comment utiliser la liste noire?Comment savoir si une chaîne contient des caractères non alphanumériques en C#/.NET 2.0?

+0

Un autre thread ayant des réponses à considérer http://stackoverflow.com/questions/2371780/ Peut fournir des informations supplémentaires. –

+0

duplication possible de [.net Regular Expression pour correspondre à n'importe quel type de lettre de n'importe quelle langue] (http://stackoverflow.com/questions/2949861/net-regular-expression-to-match-any-kind-of-letter- de-tout-langue) – GvS

Répondre

30

Je ne sais pas comment les caractères spéciaux de tous ces langages sont catégorisés, mais vous pouvez vérifier si la méthode Char.IsLetterOrDigit correspond à ce que vous voulez faire. Il fonctionne au moins pour les chiffres et les lettres que j'ai testé:

string test = "Aasdf345ÅÄÖåäöéÉóÓüÜïÏôÔ"; 
if (test.All(Char.IsLetterOrDigit)) { ... } 

Les retours Char.IsLetterOrDigit vrai pour les caractères qui sont classés en Unicode comme UppercaseLetter, LowercaseLetter, TitlecaseLetter, ModifierLetter, OtherLetter ou DecimalDigitNumber.

+0

Qu'est-ce que le test.Tout? Ce n'est pas une méthode de chaîne, est-ce une sorte de méthode d'extension? Ou une méthode LINQ? – Task

+0

@Task 'All' est une extension linq de la chaîne. Voir http://msdn.microsoft.com/en-us/library/system.string.aspx – mydogisbox

+0

Ah! La section "Méthodes d'extension" de la documentation est nouvelle pour moi, je n'avais pas vu ça auparavant. Je suppose que je me suis trop habitué à trouver tout ce dont j'ai besoin dans la zone "Propriétés" ou "Méthodes". Merci! – Task

5

Recherchez char.IsLetterOrDigit(char).

Par exemple:

myString.All(c => char.IsLetterOrDigit(c)); 
+1

Juste curieux, mais pourquoi était-ce downvoted? Pour autant que je sache, c'est une façon parfaitement valable de faire ce que le PO a demandé. – Flynn1179

+0

Ah .. juste regardé de plus près; jamais remarqué l'exigence 0-9 là-bas.J'ai modifié ma réponse pour utiliser 'IsLetterOrDigit' au lieu de simplement' IsLetter'. – Flynn1179

+0

Un raccourci pour cela est 'myString.All (char.IsLetterOrDigit);' – gls123

4

Une liste noire pour les personnages est probablement assez grand :-)

Vous pouvez utiliser l'expression régulière

^[\d\p{L}]+$ 

pour correspondre à des chiffres décimaux et des lettres, quel que soit de script.

Cette expression régulière se compose d'une classe de caractères contenant les sténographies \d - qui contient tous les chiffres (230 au total dans le BMP) et \p{L} qui contient tous les caractères Unicode classés comme une « lettre » (46817 dans le BMP). Ladite classe de caractères est ensuite répétée au moins une fois et insérée entre ^ et $ - les ancres de début et de fin de la chaîne, de sorte qu'elle correspond à la chaîne complète.

Pour certains moteurs regex, puisque vous n'êtes intéressé que par les lettres latines, apparemment, vous pouvez également utiliser

^[\d\p{Letter}]+$ 

Cependant, .NET ne supporte pas. Le premier regex mentionné ci-dessus capture en fait tout ce qui est un chiffre ou une lettre en n'importe quel script. Donc, il sera consciencieusement correspondre à des chiffres indiens ou arabes et hébreu, cyrillique et d'autres scripts non latins. En fonction de ce que vous voulez, cela peut ne pas être approprié.

Si cela pose un problème, alors je ne vois pas de meilleure option que de lister explicitement les caractères que vous voulez autoriser. Cependant, je considère qu'il est dangereux de supposer que le texte dans une certaine langue est toujours limité au script de cette langue. Si je devais écrire un nom tchèque ou polonais dans un texte allemand, j'aurais probablement besoin de plus de [a-zA-ZäöüÄÖÜß].

+0

+1 pour le \ p {option} –

+0

merci! Pouvez-vous expliquer comment^[\ d \ p {L}] + $ fonctionne. J'ai vérifié sur le Web mais je ne pouvais pas le résumer entièrement ... –

-1

Il serait plus simple de faire correspondre les caractères autorisés à un faux retour.

Questions connexes