检查字符串是否为十六进制数字的有效表示法

问题描述 投票:7回答:6

我对regex完全是菜鸟。我的目标是检查字符串是否正确表示十六进制数字。目前,我的实现方式(我发现它实际上效率不高)是具有所有十六进制数字(0,1,... 9,A,B..F)的列表,并检查我的字符串是否包含给定列表中未包含的字符。我敢打赌,使用正则表达式可以轻松完成此操作,但我不知道如何实现。

 private bool ISValidHEX(string s)
       {
           List<string> ToCheck = new List<string>();
           for (int i = 0; i < 10; i++)
           {
               ToCheck.Add(i.ToString());
           }
           ToCheck.Add("A");
           ToCheck.Add("B");
           ToCheck.Add("C");
           ToCheck.Add("D");
           ToCheck.Add("E");
           ToCheck.Add("F");
           for (int i = 0; i < s.Length; i++)
           {
               if( !ToCheck.Contains(s.Substring(i,1)))
               {
                   return false;
               }
           }
           return true;
       }
c# regex hex
6个回答
15
投票

我以为,尝试将您的字符串转换为整数类型并处理任何异常最快。使用如下代码:

int num = Int32.Parse(s, System.Globalization.NumberStyles.HexNumber);

结果代码可能比正则表达式更易于遵循,并且在需要解析值时特别有用(否则您可以使用在其他答案中充分记录的Int32.TryParse

((我最喜欢的引文是杰米·扎温斯基(Jamie Zawinski):“有些人遇到问题时,认为'我知道,我将使用正则表达式。现在他们有两个问题。”]


11
投票

简单检查

检查字符串是否正确表示十六进制数字

您可以使用类似的方法:

int res = 0; 
if(int.TryParse(val, 
         System.Globalization.NumberStyles.HexNumber, 
         System.Globalization.CultureInfo.InvariantCulture, out res)) {

      //IT'S A VALID HEX
}

请注意System.Globalization.CultureInfo.InvariantCulture参数,根据需要进行更改。


4
投票

我建议使用Int32.TryParse。有一个允许十六进制数字转换的重载

int v;
string test = "FF";
if(Int32.TryParse(test, NumberStyles.HexNumber, CultureInfo.CurrentCulture, out v))
   Console.WriteLine("Is HEX:" + v.ToString());

这比简单的Int32.Parse好,因为在无效的十六进制或转换溢出Int32.MaxValue的情况下,您不会得到异常,但可以仅测试布尔值返回值。

警告,字符串不能以“ 0x”或“&H”为前缀


2
投票

^[0-9a-fA-F]+$将匹配数字和有效十六进制字母的字符串,但是这与前面可能的0x不匹配。我相信您可以根据需要添加它。


1
投票

我尝试过Google搜索。我找到了很多解决方案。这是两个:

Validate Hex Color Code with Regular Expression

Regular Expression Hexadecimal Number Validation

示例

//use System.Text.RegularExpressions before using this function
public bool vldRegex(string strInput)
{
//create Regular Expression Match pattern object
Regex myRegex = new Regex("^[a-fA-F0-9]+$");
//boolean variable to hold the status
bool isValid = false;
if (string.IsNullOrEmpty(strInput))
{
   isValid = false;
}
else
{
   isValid = myRegex.IsMatch(strInput);
}
//return the results
return isValid;
}

0
投票

如果您的十六进制字符串最多包含32个字符(例如,通常GUID符合此要求,那么您可以PadLeft带有零的字符串以确保始终具有32个字符,然后使用Guid.TryParse

public static bool IsHex(string hexString)
{
    var isHex = false;
    if ((hexString ?? string.Empty).Length == 0)
        return false;
    if (hexString.Length > 0 && hexString.Length <= 32)
    {
        hexString = hexString.PadLeft(32, '0');
        Guid guid;
        isHex = Guid.TryParse(hexString, out guid);
    }
    else
    {
        throw new NotImplementedException("Use some other way to check the hex string!");
    }
    return isHex;
}

在这里尝试:https://dotnetfiddle.net/bLaCAT

© www.soinside.com 2019 - 2024. All rights reserved.