Подтвердить что ты не робот

Как проверить, что строка написана на английском языке?

Я прочитал строку из консоли. Как я могу убедиться, что он содержит только английские символы и цифры?

4b9b3361

Ответ 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!";
    }
?>