Проверить строку на наличие недопустимых символов? Умный способ?
Я хочу проверить строку на наличие недопустимых символов. С недопустимыми символами я имею в виду символы, которых не должно быть. Какие герои эти? Это другое, но я думаю, что это не так важно, важно, как я должен это сделать и каков самый простой и лучший способ (производительность) сделать это?
скажем, я просто хочу строки, которые содержат 'A-Z',' пустой','.', '$', '0-9'
Так что если у меня есть строка типа "привет Сайте StackOverflow" => недопустимо, из-за 'a'.
Хорошо, как это сделать? Я мог бы сделать List<char>
и поместите в него каждый символ, который не разрешен, и проверьте строку с этим списком. Может быть, не очень хорошая идея, потому что тогда было много символов. Но я мог бы составить список, содержащий все разрешенные символы, верно? А потом? Для каждого символа в строке я должен сравнить List<char>
? Какой-нибудь умный код для этого? И еще один вопрос: если бы я добавил A-Z к List<char>
Я должен добавить 25 символов вручную, но эти символы, как я знаю, 65-90 в таблице ASCII, могу ли я добавить их проще? Есть предложения? Спасибо
2 ответов
для этого можно использовать регулярное выражение:
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
}
но вам это не нужно с Regex-почти каждый движок regex понимает синтаксис диапазона (A-Z
).
Я только что написал такую функцию и расширенную версию, чтобы ограничить первый и последний символы, когда это необходимо. Исходная функция просто проверяет, состоит ли строка только из допустимых символов, расширенная функция добавляет два целых числа для чисел допустимых символов в начале списка, которые будут пропущены при проверке первого и последнего символов, на практике она просто вызывает исходную функцию 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;
}