在我的函数中,我有一个字符串参数,通常表示两位十六进制数,如 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}$");
如果您接受一个符号十六进制(例如 A
、0
、C
)以及两个符号(AA
、3F
、02
)
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 是否在正确的范围内,但它降低了此方法的整体简单性。不过,我仍然比正则表达式更喜欢它。对于大多数人来说,代码也更容易阅读,因为正则表达式有时不是很直观,只需查看它就无法理解。
但这并没有考虑到区分大小写,但大多数场景不会关心这一点,如果最终目标是显示数字,或者将它们传递给重要的第三方,只需将字符串作为大写发送即可。