我有一个长字符串(8000个字符),只能包含十六进制和换行符。
验证/验证字符串是否包含无效字符的最佳方法是什么?
有效字符为:0到9和A到F.新行应该可以接受。
我从这段代码开始,但它无法正常工作(即当“G”是第一个字符时无法返回false):
public static bool VerifyHex(string _hex)
{
Regex r = new Regex(@"^[0-9A-F]+$", RegexOptions.Multiline);
return r.Match(_hex).Success;
}
答案 0 :(得分:5)
另一种选择,如果您喜欢使用LINQ而不是正则表达式:
public static bool IsHex(string text)
{
return text.All(IsHexChar);
}
private static bool IsHexCharOrNewLine(char c)
{
return (c >= '0' && c <= '9') ||
(c >= 'A' && c <= 'F') ||
(c >= 'a' && c <= 'f') ||
c == '\n'; // You may want to test for \r as well
}
或者:
public static bool IsHex(string text)
{
return text.All(c => "0123456789abcdefABCDEF\n".Contains(c));
}
在这种情况下,我认为正则表达式可能是一个更好的选择,但为了感兴趣,我想提一下LINQ:)
答案 1 :(得分:3)
你误解了Multiline
option:
使用多线模式,其中 ^ 和 $ 匹配每行的开头和结尾(而不是开头 和输入字符串的结尾)。
将其更改为
static readonly Regex r = new Regex(@"^[0-9A-F\r\n]+$");
public static bool VerifyHex(string _hex)
{
return r.Match(_hex).Success;
}
答案 2 :(得分:1)
已经有一些很好的答案,但没有人提到使用内置解析,这似乎是最直接的方式:
public bool IsHexString(string hexString)
{
System.Globalization.CultureInfo provider = new System.Globalization.CultureInfo("en-US");
int output = 0;
return Int32.TryParse(hexString, System.Globalization.NumberStyles.HexNumber, provider, out output))
}