Проверьте, содержит ли строка только буквы, цифры и символы подчеркивания
Я должен проверить, содержит ли строка только буквы, цифры и символы подчеркивания. Вот как я пытался, но это не работает:
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*$");