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

Posted

技术标签:

【中文标题】检查字符串是不是是十六进制数的有效表示【英文标题】:Check if string is valid representation of hex number检查字符串是否是十六进制数的有效表示 【发布时间】:2014-11-14 00:41:57 【问题描述】:

对于regex,我完全是菜鸟。

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

目前我的实现(我觉得效率很低)是有一个包含所有十六进制数字(0-9,A-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;

【问题讨论】:

【参考方案1】:

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

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

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

(我最喜欢引用 Jamie Zawinski 的一句话:“有些人在遇到问题时会想‘我知道,我会使用正则表达式。’现在他们有两个问题。”)

【讨论】:

+1。甚至是 TryParse 版本 - Int32.TryParse(input, System.Globalization.NumberStyles.HexNumber, null, out myInt);【参考方案2】:

简单检查

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

你可以使用如下方法:

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

【讨论】:

@Bathsheba:一点也不。试试看。 我认为InvariantCulture 在这里完全正确。它不像十六进制字符串应该重音字符、千位分隔符或小数点!十六进制数字是否存在公认的文化差异? 还有一点需要注意的是十六进制字符串的长度。如果字符串长度超过 8 个字符,int.TryParse 将失败。 long.TryParse 将允许 16 个字符。【参考方案3】:

我建议使用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”为前缀

【讨论】:

【参考方案4】:

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

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;

【讨论】:

链接很棒,只有链接的答案不是。确保引用任何相关部分或给出使用示例。 这个答案在我的情况下效果最好,我需要测试更大的字符串,格式为“5e580ab3285bae22d4157ede”。对于这些情况,其他建议的解决方案在尝试转换为 Int32 时出现错误。虽然它包含更多代码,但我相信这个解决方案值得被标记为问题的答案。【参考方案5】:

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

【讨论】:

【参考方案6】:

如果您的十六进制字符串最多包含 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

【讨论】:

以上是关于检查字符串是不是是十六进制数的有效表示的主要内容,如果未能解决你的问题,请参考以下文章

c++两个自然数(输入的十进制数转换为二进制时,两个数的位数相同。) 输出:有效则有效,无效则无效

K-进制数

BitArray类的使用--(转换二进制数的内部实现过程)

16进制,2进制,输出数的二进制表示

Python - 如何将 int 转换为表示 32 位十六进制数的字符串

C语言:怎么将十进制数字转换为二进制字符串,谁能帮我写个函数