在C#2.0中检查字符串中每个字符的最有效方法是什么?如果它们都是有效的十六进制字符则返回true,否则返回false?
void Test()
{
OnlyHexInString("123ABC"); // Returns true
OnlyHexInString("123def"); // Returns true
OnlyHexInString("123g"); // Returns false
}
bool OnlyHexInString(string text)
{
// Most efficient algorithm to check each digit in C# 2.0 goes here
}
答案 0 :(得分:71)
这样的事情:
(我不知道C#所以我不知道如何遍历字符串的字符。)
loop through the chars {
bool is_hex_char = (current_char >= '0' && current_char <= '9') ||
(current_char >= 'a' && current_char <= 'f') ||
(current_char >= 'A' && current_char <= 'F');
if (!is_hex_char) {
return false;
}
}
return true;
以上逻辑代码
private bool IsHex(IEnumerable<char> chars)
{
bool isHex;
foreach(var c in chars)
{
isHex = ((c >= '0' && c <= '9') ||
(c >= 'a' && c <= 'f') ||
(c >= 'A' && c <= 'F'));
if(!isHex)
return false;
}
return true;
}
答案 1 :(得分:60)
public bool OnlyHexInString(string test)
{
// For C-style hex notation (0xFF) you can use @"\A\b(0[xX])?[0-9a-fA-F]+\b\Z"
return System.Text.RegularExpressions.Regex.IsMatch(test, @"\A\b[0-9a-fA-F]+\b\Z");
}
答案 2 :(得分:26)
您可以对字符串执行TryParse以测试其整数中的字符串是否为十六进制数。
如果它是一个特别长的字符串,你可以把它放在块中并循环遍历它。
// string hex = "bacg123"; Doesn't parse
// string hex = "bac123"; Parses
string hex = "bacg123";
long output;
long.TryParse(hex, System.Globalization.NumberStyles.HexNumber, null, out output);
答案 3 :(得分:9)
我使用Int32.TryParse()
来执行此操作。 Here's the MSDN page on it
答案 4 :(得分:7)
以上是yjerem解决方案的LINQ版本:
private static bool IsValidHexString(IEnumerable<char> hexString)
{
return hexString.Select(currentCharacter =>
(currentCharacter >= '0' && currentCharacter <= '9') ||
(currentCharacter >= 'a' && currentCharacter <= 'f') ||
(currentCharacter >= 'A' && currentCharacter <= 'F')).All(isHexCharacter => isHexCharacter);
}
答案 5 :(得分:5)
仅仅是:
bool isHex = text.All("0123456789abcdefABCDEF".Contains);
这基本上说:检查text
字符串中的所有字符是否都存在于有效的十六进制值字符串中。
对我来说,这是最简单的可读解决方案。
(不要忘记添加using System.Linq;
)
修改强>
注意到Enumerable.All()
仅在.NET 3.5之后才可用。
答案 6 :(得分:4)
发布Jeremy's answer的VB.NET版本,因为我在寻找这样的版本时来到这里。应该很容易将其转换为C#。
''' <summary>
''' Checks if a string contains ONLY hexadecimal digits.
''' </summary>
''' <param name="str">String to check.</param>
''' <returns>
''' True if string is a hexadecimal number, False if otherwise.
''' </returns>
Public Function IsHex(ByVal str As String) As Boolean
If String.IsNullOrWhiteSpace(str) Then _
Return False
Dim i As Int32, c As Char
If str.IndexOf("0x") = 0 Then _
str = str.Substring(2)
While (i < str.Length)
c = str.Chars(i)
If Not (((c >= "0"c) AndAlso (c <= "9"c)) OrElse
((c >= "a"c) AndAlso (c <= "f"c)) OrElse
((c >= "A"c) AndAlso (c <= "F"c))) _
Then
Return False
Else
i += 1
End If
End While
Return True
End Function
答案 7 :(得分:4)
正则表达式在最好的时候效率不高。最有效的方法是使用普通的for
循环来搜索字符串的字符,然后在找到的第一个无效字符中断。
但是,LINQ可以非常简洁地完成:
bool isHex =
myString.ToCharArray().Any(c => !"0123456789abcdefABCDEF".Contains(c));
我无法保证效率,因为LINQ是LINQ,但Any()应该有一个非常优化的编译方案。
答案 8 :(得分:3)
就性能而言,最快的可能是简单地枚举字符并进行简单的比较检查。
bool OnlyHexInString(string text) {
for (var i = 0; i < text.Length; i++) {
var current = text[i];
if (!(Char.IsDigit(current) || (current >= 'a' && current <= 'f'))) {
return false;
}
}
return true;
}
要真正了解哪种方法最快,但您需要进行一些分析。
答案 9 :(得分:3)
//Another workaround, although RegularExpressions is the best solution
boolean OnlyHexInString(String text)
{
for(int i = 0; i < text.size(); i++)
if( !Uri.IsHexDigit(text.charAt(i)) )
return false;
return true;
}
答案 10 :(得分:1)
就程序员时间而言,最好调用平台的字符串到整数解析函数(例如Java的 Integer.parseInt(str,base)) ,看看你是否得到例外。如果你想自己写,可能更有时间/空间效率......
我认为效率最高的是每个角色的查找表。你有一个2 ^ 8(或2 ^ 16的Unicode)-entry数组的布尔值,如果它是一个有效的十六进制字符,则每个都是 true ,或者 false 如果没有。代码看起来像(在Java中,抱歉; - ):
boolean lut[256]={false,false,true,........}
boolean OnlyHexInString(String text)
{
for(int i = 0; i < text.size(); i++)
if(!lut[text.charAt(i)])
return false;
return true;
}
答案 11 :(得分:0)
public static bool HexInCardUID(string test)
{
if (test.Trim().Length != 14)
return false;
for (int i = 0; i < test.Length; i++)
if (!Uri.IsHexDigit(Convert.ToChar(test.Substring(i, 1))))
return false;
return true;
}**strong text**
答案 12 :(得分:0)
我提出这个解决方案来解决这个问题。执行前检查Request字符串是否为空。
for (int i = 0; i < Request.Length; i += 2)
if (!byte.TryParse(string.Join("", Request.Skip(i).Take(2)), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out _)) return false;
答案 13 :(得分:0)
这是C#扩展方法......
public static class StringExtensions
{
public static bool IsHexString(this string str)
{
foreach (var c in str)
{
var isHex = ((c >= '0' && c <= '9') ||
(c >= 'a' && c <= 'f') ||
(c >= 'A' && c <= 'F'));
if (!isHex)
{
return false;
}
}
return true;
}
//bonus, verify whether a string can be parsed as byte[]
public static bool IsParseableToByteArray(this string str)
{
return IsHexString(str) && str.Length % 2 == 0;
}
}
像这样使用......
if("08c9b54d1099e73d121c4200168f252e6e75d215969d253e074a9457d0401cc6".IsHexString())
{
//returns true...
}
答案 14 :(得分:0)
我使用这种方法:
public static bool IsHex(this char c)
{
return (c >= '0' && c <= '9') ||
(c >= 'a' && c <= 'f') ||
(c >= 'A' && c <= 'F');
}
答案 15 :(得分:0)
没有正则表达式的简单解决方案是:
VB.NET:
Public Function IsHexString(value As String) As Boolean
Dim hx As String = "0123456789ABCDEF"
For Each c As Char In value.ToUpper
If Not hx.Contains(c) Then Return False
Next
Return True
End Function
或者在C#中
public bool IsHexString(string value)
{
string hx = "0123456789ABCDEF";
foreach (char c in value.ToUpper()) {
if (!hx.Contains(c))
return false;
}
return true;
}
答案 16 :(得分:0)
您可以使用以下内容扩展字符串和字符:
public static bool IsHex(this string value)
{ return value.All(c => c.IsHex()); }
public static bool IsHex(this char c)
{
c = Char.ToLower(c);
if (Char.IsDigit(c) || (c >= 'a' && c <= 'f'))
return true;
else
return false;
}
答案 17 :(得分:0)
这可以使用正则表达式来完成,这是检查字符串是否与特定模式匹配的有效方法。
十六进制数字的可能正则表达式是[A-Ha-h0-9] ,某些实现甚至具有十六进制数字的特定代码,例如[[:xdigit:]]。
答案 18 :(得分:-4)
现在,只有
if (IsHex(text)) {
return true;
} else {
return false;
}