C#:如何检查字符串是否为两位十六进制数



在我的函数中,我有一个字符串参数,通常表示两位十六进制数,如 5E 或 0A我如何检查这个字符串是否真的是一个数字而不是其他任何东西(如 G9 或 NB 或 abcdef),并且所有字符都是用大字符(A 而不是 a)写的?感谢您的帮助

您可以尝试正则表达式

  String source = "AC";
  Boolean result = Regex.IsMatch(source, "^[0-9A-Fa-f]{2}$");

如果您只接受大写十六进制符号(A..F但不接受a..f

  Boolean result = Regex.IsMatch(source, "^[0-9A-F]{2}$");

如果您接受一个符号十六进制(例如 A0C)以及两个符号(AA3F02

  Boolean result = Regex.IsMatch(source, "^[0-9A-F]{1,2}$");

正则表达式怎么样?

private bool IsHex(string input, int maxDigits = 2)
{
    return !String.IsNullOrWhiteSpace(input) && 
           maxDigits > 0 &&
           Regex.IsMatch(input, String.Format("^[A-F0-9]{{1,{0}}}$", maxDigits));
}

您可以保留默认值(最多 2 位),也可以指定自己的限制:

bool result = IsHex("AF", 1); // Yields false

你可以为此使用正则表达式。

Regex r = new Regex("^[0-9a-f]{2,2}$", RegexOptions.IgnoreCase);
Match m = r.match(someStr);

然后你可以从这里判断你的字符串是否是一个十六进制值

public bool IsTwoDigitsHexNumber(string s) {
    return !string.IsNullOrEmpty(s) &&
        s.Length <= 2 &&
        s.All(c => c >= '0' && c <= '9' || c >= 'A' && c <= 'F');
}

根据您的特定最终目标,最简单的方法可能是尝试格式化它并处理异常。

Convert.ToInt32(yourString, 16)

然后只需捕获潜在的 FormatException,如果

值包含基数中不是有效数字的字符 由 fromBase 指定。异常消息指示存在 如果值中的第一个字符无效,则没有要转换的数字; 否则,消息指示值包含无效的尾随 字符。

在某些情况下,这不会涵盖您可能的要求,例如如果您需要确保十六进制数中只有两位数字。您可以检查返回的 int 是否在正确的范围内,但它降低了此方法的整体简单性。不过,我仍然比正则表达式更喜欢它。对于大多数人来说,代码也更容易阅读,因为正则表达式有时不是很直观,只需查看它就无法理解。

但这并没有考虑到区分大小写,但大多数场景不会关心这一点,如果最终目标是显示数字,或者将它们传递给重要的第三方,只需将字符串作为大写发送即可。

最新更新