Проверить строку на наличие недопустимых символов? Умный способ?

Я хочу проверить строку на наличие недопустимых символов. С недопустимыми символами я имею в виду символы, которых не должно быть. Какие герои эти? Это другое, но я думаю, что это не так важно, важно, как я должен это сделать и каков самый простой и лучший способ (производительность) сделать это?

скажем, я просто хочу строки, которые содержат '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;
}