Проверьте, содержит ли строка только буквы, цифры и символы подчеркивания

Я должен проверить, содержит ли строка только буквы, цифры и символы подчеркивания. Вот как я пытался, но это не работает:

for(int i = 0; i<=snameA.Length-1; i++)
{
    validA = validA && (char.IsLetterOrDigit(snameA[i])||snameA[i].Equals("_"));
}

6 ответов


Я люблю Linq для такого вопроса:

bool validA = sname.All(c => Char.IsLetterOrDigit(c) || c.Equals('_'));

назначении validA каждый раз снова, не проверяя его Предыдущее значение. Теперь вы всегда получаете значение последнего выполненного чека.

вы могли бы " и " результат:

validA &= (char.IsLetterOrDigit(snameA[i]) || snameA[i] == '_');

это означало бы, что вы все еще запускаете все символы, которые могут быть бесполезны, если первая проверка не удалась. Поэтому лучше просто выйти, если это не удастся:

for(int i = 0; i<=snameA.Length-1; i++)
{
    validA = (char.IsLetterOrDigit(snameA[i]) || snameA[i] == '_');

    if (!validA)
    { break; } // <-- see here
}

или с LINQ:

validA = snameA.All(c => char.IsLetterOrDigit(c) || c == '_');

вы можете использовать regex

Regex regex1 = new Regex(@"^[a-zA-Z0-9_]+$");

if(regex1.IsMatch(snameA))
{

}

вы можете попробовать сопоставить регулярное выражение. Существует встроенный тип для "букв, цифр и подчеркиваний", который является "\w".

Regex rgx = new Regex(@"\w*");
rgs.IsMatch(yourString);

если требуется 1 или более, используйте " \w+".

дополнительная информация здесь: регулярное выражение.IsMatch


Я бы использовал регулярное выражение

string pattern = @"^[a-zA-Z0-9\_]+$";
Regex regex = new Regex(pattern);

// Compare a string against the regular expression
return regex.IsMatch(stringToTest);

во-первых,письмо немного расплывчатый термин: вы имеете в виду a..z и A..Z символы или буквы могут принадлежать любой алфавит, например,а..я и А..Я (русский язык, кириллица). Согласно вашему текущая реализация вы хотите второй вариант.

типичным решением с циклом является проверка до первого встречного примера:

  Boolean validA = true; // true - no counter examples so far

  // Why for? foreach is much readble here
  foreach(Char ch in sname) 
    // "!= '_'" is more readable than "Equals"; and wants no boxing
    if (!char.IsLetterOrDigit(ch) && ! (ch != '_')) { 
      Boolean validA = false; // counter example (i.e. non-letter/digit symbol found)

      break; // <- do not forget this: there's no use to check other characters
    }

однако вы можете упростить код с помощью в LINQ:

  validA = sname.All(ch => Char.IsLetterOrDigit(ch) || ch == '_');

или регулярные выражения:

  validA = Regex.IsMatch(sname, @"^\w*$");