为了完整起见,我想提供一些实现方案。总的来说,正则表达式是一种昂贵的方法,特别是当字符串很大时(例如传输大文件时)。以下方法首先尝试最快的检测方式。
public static class HelperExtensions {
private static Char[] Base64Chars = new[] { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/' };
public static Boolean IsBase64String(this String value) {
if (value == null || value.Length == 0 || value.Length % 4 != 0
|| value.Contains(' ') || value.Contains('\t') || value.Contains('\r') || value.Contains('\n'))
return false;
var index = value.Length - 1;
if (value[index] == '=')
index--;
if (value[index] == '=')
index--;
for (var i = 0; i <= index; i++)
if (!Base64Chars.Contains(value[i]))
return false;
return true;
}
}
编辑
根据 Sam 的建议,您还可以稍微改变源代码。他提供了一个更好的测试最后一步的表现方式。这个例程
private static Boolean IsInvalid(char value) {
var intValue = (Int32)value;
if (intValue >= 48 && intValue <= 57)
return false;
if (intValue >= 65 && intValue <= 90)
return false;
if (intValue >= 97 && intValue <= 122)
return false;
return intValue != 43 && intValue != 47;
}
可以使用以下代码将 if (!Base64Chars.Contains(value[i]))
替换为 if (IsInvalid(value[i]))
从 Sam 改进后的完整源代码如下(为了清晰起见已删除注释)
public static class HelperExtensions {
public static Boolean IsBase64String(this String value) {
if (value == null || value.Length == 0 || value.Length % 4 != 0
|| value.Contains(' ') || value.Contains('\t') || value.Contains('\r') || value.Contains('\n'))
return false;
var index = value.Length - 1;
if (value[index] == '=')
index--;
if (value[index] == '=')
index--;
for (var i = 0; i <= index; i++)
if (IsInvalid(value[i]))
return false;
return true;
}
private static Boolean IsInvalid(char value) {
var intValue = (Int32)value;
if (intValue >= 48 && intValue <= 57)
return false;
if (intValue >= 65 && intValue <= 90)
return false;
if (intValue >= 97 && intValue <= 122)
return false;
return intValue != 43 && intValue != 47;
}
}
\n\fLE16
——你的方法会对此产生错误的判断结果。对于任何正在阅读并寻找一个无懈可击的方法的人来说,我建议捕获FormatException或使用适合规范的正则表达式,请参见https://dev59.com/unRB5IYBdhLWcg3w6LN2。 - nullable@"^[a-zA-Z0-9\+/]*={0,2}$"
。 - 4Z4T4R