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

时间:2014-09-19 12:07:45

标签: c# regex hex

我是关于regex的总菜鸟。 我的目标是检查一个字符串是否是十六进制数的有效重复。 目前我的实现(我发现它实际上效率不高)是一个包含所有HEX数字(0,1,... 9,A,B..F)的List,并检查我的字符串是否包含未包含在给定List中的字符。  我打赌这可以使用正则表达式轻松完成,但我不知道如何实现它。

 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;
       }

6 个答案:

答案 0 :(得分:13)

我原以为尝试将字符串转换为整数类型并处理任何异常都是最快的。使用这样的代码:

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

生成的代码可能比正则表达式更容易理解,如果您需要解析的值,则特别有用(否则您可以使用其他答案中充分记录的Int32.TryParse)。

(我最喜欢的一句话是Jamie Zawinski:&#34;有些人在面对问题时,想想,我知道,我会使用正则表达式。&#39;现在他们有两个问题。&#34;)

答案 1 :(得分:10)

简单检查

  

检查字符串是否是有效的HEX编号重复

您可以使用以下方法:

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参数,根据需要进行更改。

答案 2 :(得分: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”或“&amp; H”为前缀

答案 3 :(得分:2)

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

答案 4 :(得分:0)

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

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;
}

答案 5 :(得分:0)

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

Guid.TryParse

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