Vérifier une chaîne pour voir si tous les caractères sont des valeurs hexadécimales
Quel est le moyen le plus efficace en C# 2.0 pour vérifier chaque caractère dans une chaîne de caractères et retourne true si ils sont tous valides caractères hexadécimaux et false dans le cas contraire?
Exemple
void Test()
{
OnlyHexInString("123ABC"); //Returns true
OnlyHexInString("123def"); //Returns true
OnlyHexInString("123g"); //Returns false
}
bool OnlyHexInString(string text)
{
//Most efficient algorithm to check each digit in C# 2.0 goes here
}
- Voir stackoverflow.com/questions/9192446/...
- Peut-être que vous pouvez utiliser: docs.microsoft.com/nl-be/dotnet/api/...
Vous devez vous connecter pour publier un commentaire.
0x
préfixe (et hachez-les au besoin), et sur mon système, je peux boucle ~100 000 32ms (en moyenne plus de 10 fois).\A\b
au lieu d'un simple^
? Ne pas le début d'une chaîne de toujours être à une limite de mot? Même question pour\b\Z
vs$
.\b
est redondant ici, merci de lire ce postQuelque chose comme ceci:
(Je ne sais pas C# donc je ne sais pas comment faire une boucle à travers les caractères d'une chaîne.)
Code pour la Logique ci-Dessus
&& chars.Count() % 2 == 0
new Regex("(^|,)e", RegexOptions.IgnoreCase).Matches(string.Join(",", someList)).Count == someList.Count
de vérifier que chaque élément de la liste commence avec une
.Vous pouvez faire un TryParse sur la chaîne à tester si la chaîne dans son entirity est un nombre hexadécimal.
Si c'est une longue chaîne, vous pourriez prendre en morceaux et boucle à travers elle.
- Je utiliser
Int32.TryParse()
pour ce faire. Voici la page MSDN sur elle.10
, alors il pourrait y avoir un0x
qui doit être vérifié (pour éviter un dépassement de capacité si c'est à deux chiffres supplémentaires). Autre chose, quelque chose> 8
serait trop grande, soit de la valeur. Le cadre peut probablement alors poignée signé vs non signé. Répétez l'opération pour Int16/UInt16, Int64/UInt64, et Byte/SByte. On peut sans doute même de créer une courte extension de la méthode des talons à ces fins, à être plus intelligent.Voici une LINQ version de yjerem's solution ci-dessus:
return hexString.All(c => (...))
.Ce sujet justement:
bool isHex = text.All("0123456789abcdefABCDEF".Contains);
Cela dit en gros: vérifier si tous les caractères dans le
text
chaîne n'existe pas dans la chaîne de valeurs hexadécimales.Qui est le plus simple encore lisible solution pour moi.
(n'oubliez pas d'ajouter
using System.Linq;
)EDIT:
Viens de remarquer que
Énumérable.Tous les()
est disponible depuis .NET 3.5.L'affichage d'un VB.NET la version de Jeremy réponse, parce que je suis arrivé ici en cherchant une telle version. Doit être facile à convertir en C#.
Une expression régulière n'est pas très efficace dans le meilleur des cas. Le plus efficace sera en utilisant un simple
for
boucle à la recherche à travers les caractères de la chaîne, et sur les premiers non valide trouvé.Cependant, il peut être fait de façon très succincte avec LINQ:
Je ne peux pas se porter garant de l'efficacité, depuis LINQ est LINQ, mais Tout() doit avoir un assez bien optimisé compilation régime.
Enumerable.All()
est un peu plus lisible. Voir ma réponse. Aussi simplement que LinQ est disponible depuis .NET 3.5.En termes de performance la plus rapide est susceptible de simplement énumérer les personnages et de faire une simple comparaison vérifier.
Pour vraiment savoir quelle méthode est la plus rapide si vous aurez besoin de faire quelques recherches.
En termes de programmeur temps, il est probablement préférable de faire appel à votre plate-forme de chaîne de caractères-à-entier fonction d'analyse syntaxique (comme Java est Entier.parseInt(str, de la base)), et voir si vous obtenez une exception. Si vous voulez écrire vous-même, et potentiellement plus de temps/espace-efficace...
Plus efficace je suppose que serait une table de recherche sur chaque personnage. Vous avez un 2^8 (ou 2^16 pour Unicode)-entrée de tableau de booléens, dont chacun serait vrai si elle est valide hex caractère, ou faux si pas. Le code devrait ressembler à quelque chose comme (en Java, désolé ;-):
Ce qui pourrait être fait avec les expressions régulières sont un moyen efficace de vérifier si une chaîne correspond à un modèle particulier.
Une possible expression régulière pour un chiffre hexadécimal serait [Un-Ha-h0-9], certaines implémentations de même avoir un code spécifique pour les chiffres hexadécimaux, par exemple [[:xdigit:]].
Vous pouvez Étendre string et char à l'aide de quelque chose comme ceci:
Une solution facile sans des expressions régulières est:
VB.NET:
Ou en C#
J'utilise cette méthode:
Et ce que C# méthode d'extension...
L'utiliser comme si...
J'ai fait cette solution à venir autour de cette question. Vérifier que la chaîne de Demande n'est pas null avant de l'exécuter.
Maintenant, seulement
IsHex
méthode. Il n'existe pas de méthode intégrée.if(test) {return true;} else {return false;}
sont équivalentes à simplementreturn test;