如何测试字符串是否只包含C#中的十六进制字符?

时间:2010-09-08 16:50:37

标签: c# string validation

我有一个长字符串(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;
}

3 个答案:

答案 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))
}