Я прочитал строку из консоли. Как я могу убедиться, что он содержит только английские символы и цифры?
Как проверить, что строка написана на английском языке?
Ответ 1
Предполагая, что по "английским символам" вы просто ссылаетесь на 26-значный латинский алфавит, это будет область, где я буду использовать регулярные выражения: ^[a-zA-Z0-9 ]*$
Например:
if( Regex.IsMatch(Console.ReadLine(), "^[a-zA-Z0-9]*$") )
{ /* your code */ }
Преимущество регулярных выражений в этом случае состоит в том, что все, что вам действительно волнует, это то, соответствует ли строка шаблону - это тот, где регулярные выражения работают чудесно. Он четко отражает ваши намерения, и его легко расширить, если вы определяете "английские символы", выходящие за пределы только 26 буквенных.
Здесь есть достойная серия статей, в которой больше рассказывается о регулярных выражениях.
Ответ Jørn Schou-Rode дает отличное объяснение того, как представленное здесь регулярное выражение работает в соответствии с вашим вводом.
Ответ 2
Вы можете сопоставить его с этим регулярным выражением: ^[a-zA-Z0-9]*$
-
^
соответствует началу строки (т.е. до этой точки не допускаются символы) -
[a-zA-Z0-9]
соответствует любой букве из a-z в нижнем или верхнем регистре, а также цифрам 0-9 -
*
позволяет предыдущему совпадению повторяться ноль или более раз -
$
соответствует концу строки (т.е. после этой точки не допускаются символы)
Чтобы использовать выражение в программе на С#, вам нужно будет импортировать 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);
}
Ответ 3
У вас есть доступ к сети? я бы предположил, что это невозможно гарантировать, но у Google есть язык api, который будет определять язык, который вы передаете ему. google language api
Ответ 4
bool AllAscii(string str)
{
return !str.Any(c => !Char.IsLetterOrDigit(c));
}
Ответ 5
Другой способ - проверить, не вернули ли IsLower и IsUpper оба значения true. Что-то вроде:
private bool IsAllCharEnglish(string Input)
{
foreach (var item in Input.ToCharArray())
{
if (!char.IsLower(item) && !char.IsUpper(item) && !char.IsDigit(item) && !char.IsWhiteSpace(item))
{
return false;
}
}
return true;
}
и для использования:
string str = "فارسی abc";
IsAllCharEnglish(str); // return false
str = "This is all english 123";
IsAllCharEnglish(str); // return true
Ответ 6
Что-то вроде этого (если вы хотите управлять вводом):
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();
}
Ответ 7
Если я не использую 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 - лучшее решение.
Ответ 8
Я согласен с ответами регулярного выражения. Однако вы можете упростить его до "^ [\ w] + $". \w - это любой "символ слова" (который преобразуется в [a-zA-Z_0-9], если вы используете алфавит без юникода. Я не знаю, хотите ли вы также подчеркнуть.
Подробнее о regexes в .net здесь: http://msdn.microsoft.com/en-us/library/ms972966.aspx#regexnet_topic8
Ответ 9
bool onlyEnglishCharacters = !EnglishText.Any(a => a > '~');
Кажется дешевым, но это сработало для меня, законный легкий ответ. Надеюсь, это поможет любому.
Ответ 10
Как указывалось многими, принятый ответ работает только в том случае, если в строке есть одно слово. Поскольку нет ответов, которые охватывают случай нескольких слов или даже предложений в строке, вот код:
stringToCheck.Any(x=> char.IsLetter(x) && !((int)x >= 63 && (int)x <= 126));
Ответ 11
<?php
$string="हिन्दी";
$string="Manvendra Rajpurohit";
echo strlen($string); echo '<br>';
echo mb_strlen($string, 'utf-8');
echo '<br>';
if(strlen($string) != mb_strlen($string, 'utf-8'))
{
echo "Please enter English words only:(";
}
else {
echo "OK, English Detected!";
}
?>