我想检查一些字符串是否包含无效字符。对于无效字符,我的意思是不应该存在的字符。这些是什么角色?这是不同的,但我认为那不重要,重要的是我应该怎么做以及最简单和最好的方式(性能)呢?
假设我只想要包含'A-Z','空','。','$','0-9'
的字符串所以,如果我有一个字符串,如“ HELLO STaCKOVERFLOW ”=>无效,因为'a'。
好的,现在该怎么做?我可以创建一个List<char>
并将不允许的每个字符放入其中,并使用此列表检查字符串。也许不是一个好主意,因为那时有很多字符。但我可以制作一个包含所有允许的字符的列表吗?然后?对于字符串中的每个字符,我必须比较List<char>
?任何智能代码?还有一个问题:如果我要将A-Z添加到List<char>
我必须手动添加25个字符,但这些字符就像我在ASCII表中的65-90那样,我可以更容易地添加它们吗?有什么建议?谢谢
答案 0 :(得分:17)
您可以使用正则表达式:
Regex r = new Regex("[^A-Z0-9.$ ]$");
if (r.IsMatch(SomeString)) {
// validation failed
}
要创建A-Z
或0-9
中的字符列表,您将使用一个简单的循环:
for (char c = 'A'; c <= 'Z'; c++) {
// c or c.ToString() depending on what you need
}
但是你不需要使用正则表达式 - 几乎每个正则表达式引擎都能理解范围语法(A-Z
)。
答案 1 :(得分:0)
我刚刚编写了这样一个函数,以及一个扩展版本,可以在需要时限制第一个和最后一个字符。原始函数仅检查字符串是否仅由有效字符组成,扩展函数在检查第一个和最后一个字符时为要跳过的列表开头的有效字符数添加两个整数,实际上它只是调用原始函数3次,在下面的示例中,它确保字符串以字母开头,而不是以下划线结尾。
StrChr(String, "_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"));
StrChrEx(String, "_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ", 11, 1));
BOOL __cdecl StrChr(CHAR* str, CHAR* chars)
{
for (int s = 0; str[s] != 0; s++)
{
int c = 0;
while (true)
{
if (chars[c] == 0)
{
return false;
}
else if (str[s] == chars[c])
{
break;
}
else
{
c++;
}
}
}
return true;
}
BOOL __cdecl StrChrEx(CHAR* str, CHAR* chars, UINT excl_first, UINT excl_last)
{
char first[2] = {str[0], 0};
char last[2] = {str[strlen(str) - 1], 0};
if (!StrChr(str, chars))
{
return false;
}
if (excl_first != 0)
{
if (!StrChr(first, chars + excl_first))
{
return false;
}
}
if (excl_last != 0)
{
if (!StrChr(last, chars + excl_last))
{
return false;
}
}
return true;
}
答案 2 :(得分:0)
如果使用的是c#,则可以使用List和contains轻松完成。您可以使用相同的单个字符(字符串)或多字符字符串
var pn = "The String To ChecK";
var badStrings = new List<string>()
{
" ","\t","\n","\r"
};
foreach(var badString in badStrings)
{
if(pn.Contains(badString))
{
//Do something
}
}