Я считал строку из консоли. Как я удостоверяюсь, что это только содержит английские символы и цифры?
Предполагая, что «английские символы» вы просто имеете в виду 26-значный латинский алфавит, это будет область, в которой я бы использовал регулярные выражения: ^ [a-zA-Z0-9] * $
Например:
if( Regex.IsMatch(Console.ReadLine(), "^[a-zA-Z0-9]*$") )
{ /* your code */ }
Преимущество регулярных выражений в этом случае состоит в том, что все, что вас действительно волнует, - соответствует ли строка pattern - здесь прекрасно работают регулярные выражения. Он четко отражает ваше намерение, и его легко расширить, если вы расширите определение «английских символов» за пределы 26 буквенных символов.
Здесь есть приличная серия статей , в которых рассказывается больше о регулярных выражениях.
Ответ Йорна Скоу-Роде дает прекрасное объяснение того, как регулярное выражение, представленное здесь, работает в соответствии с вашим вводом.
у вас есть доступ в Интернет? Я предполагаю, что это не может быть гарантировано, но у Google есть API языка, который определит язык, который вы ему передаете. API языка Google
Примерно так (если вы хотите управлять вводом):
static string ReadLettersAndDigits() {
StringBuilder sb = new StringBuilder();
ConsoleKeyInfo keyInfo;
while ((keyInfo = Console.ReadKey(true)).Key != ConsoleKey.Enter) {
char c = char.ToLower(keyInfo.KeyChar);
if (('a' <= c && c <= 'z') || char.IsDigit(c)) {
sb.Append(keyInfo.KeyChar);
Console.Write(c);
}
}
return sb.ToString();
}
Если я не хочу использовать RegEx, и просто для альтернативного решения, вы можете просто проверить ASCII код каждого символа, и если он находится между этим диапазоном, то это будет либо английская буква, либо число (это может быть не лучшим решением):
foreach (char ch in str.ToCharArray())
{
int x = (int)char;
if (x >= 63 and x <= 126)
{
//this is english letter, i.e.- A, B, C, a, b, c...
}
else if(x >= 48 and x <= 57)
{
//this is number
}
else
{
//this is something diffrent
}
}
http://en.wikipedia.org/wiki/ASCII для полной таблицы ASCII.
Но я все еще думаю, что RegEx - лучшее решение.
Вы можете сопоставить это с этим регулярное выражение: ^ [a-zA-Z0-9] * $
^
соответствует началу строки (т. е. перед этой точкой нельзя использовать символы) [a-zA-Z0-9]
соответствует любой букве от az в нижнем или верхнем регистре, а также цифрам 0-9 *
позволяет предыдущему совпадению повторять ноль или более times $
соответствует концу строки (т. е. после этой точки нельзя использовать символы) Чтобы использовать выражение в программе на C #, вам необходимо импортировать System.Text.RegularExpressions
и сделайте что-то вроде этого в своем коде:
bool match = Regex.IsMatch(input, "^[a-zA-Z0-9]*$");
Если вы собираетесь протестировать множество строк по шаблону, вы можете скомпилировать выражение:
Regex pattern = new Regex("^[a-zA-Z0-9]*$", RegexOptions.Compiled);
for (int i = 0; i < 1000; i++)
{
string input = Console.ReadLine();
pattern.IsMatch(input);
}
bool AllAscii(string str)
{
return !str.Any(c => !Char.IsLetterOrDigit(c));
}
Я согласен с ответами о регулярном выражении. Однако вы можете упростить его до простого "^[\w]+$". \w - это любой "символ слова" (который переводится как [a-zA-Z_0-9], если вы используете неюникодный алфавит. Я не знаю, нужны ли вам также символы подчеркивания.
Подробнее о регексах в .net здесь: http://msdn.microsoft.com/en-us/library/ms972966.aspx#regexnet_topic8