【发布时间】:2012-02-29 20:04:42
【问题描述】:
我有一个方法检查 字符串是否 有效的十六进制字符串:
public bool IsHex(string value)
{
if (string.IsNullOrEmpty(value) || value.Length % 2 != 0)
return false;
return
value.Substring(0, 2) == "0x" &&
value.Substring(2)
.All(c => (c >= '0' && c <= '9') ||
(c >= 'a' && c <= 'f') ||
(c >= 'A' && c <= 'F'));
}
规则是:
表达式必须由偶数个十六进制数字(0-9、AF、af)组成。
字符0x必须是前两个表达式中的字符。
我确信它可以用正则表达式重写,以更简洁、更有效的方式。
你能帮我解决这个问题吗?
【问题讨论】:
-
我不知道效率,但它肯定是一个班轮。不要假设 Regex 会比您的实现更有效。
-
你的方法不检查它是否包含一个十六进制字符串,它检查它是否是一个十六进制字符串和一个十六进制字符串只有。细微的差别。另外,它只允许长度为 2 的倍数的十六进制值。
-
@Abel,你是对的。在原始帖子中编辑。
-
您当前的代码允许
0x作为有效的十六进制字符串。这是故意的吗? -
@Oded:David 的当前方法总是遍历 all 个字符。正则表达式只会在必要时这样做。如果第一个字符不是
0,它将立即停止。此外,正则表达式引擎在可能的情况下使用直接查找表(意思是:当前字符不在查找中,然后失败,这比多个 if 更快)并且它向前跳跃尽可能大。很难击败一个好的正则表达式。有关正则表达式引擎如何深入工作,请参阅 Jeffery Friedl 的 Mastering Regular Expressions。