Как мне проверить, что строка на английском? - PullRequest
18 голосов
/ 15 февраля 2010

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

Ответы [ 13 ]

28 голосов
/ 15 февраля 2010

Предполагая, что под "английскими символами" вы просто ссылаетесь на латинский алфавит из 26 символов, это будет область, где я буду использовать регулярные выражения: ^[a-zA-Z0-9 ]*$

Например:

if( Regex.IsMatch(Console.ReadLine(), "^[a-zA-Z0-9]*$") )
{ /* your code */ }

Преимущество регулярных выражений в этом случае состоит в том, что все, что вас действительно волнует, - соответствует ли строка шаблону - это то место, где регулярные выражения прекрасно работают. Он четко отражает ваши намерения, и его легко расширить, если определение «английских символов» выходит за рамки 26 буквенных символов.

Здесь есть приличная серия статей , в которых больше рассказывается о регулярных выражениях.

Ответ Йорна Шоу-Роде дает отличное объяснение того, как регулярное выражение, представленное здесь, работает в соответствии с вашими данными.

16 голосов
/ 15 февраля 2010

Вы можете сопоставить его с этим регулярным выражением: ^[a-zA-Z0-9]*$

  • ^ соответствует началу строки (т. Е. Символы не допускаются до этой точки)
  • [a-zA-Z0-9] соответствует любой букве a-z в нижнем или верхнем регистре, а также цифрам 0-9
  • * позволяет предыдущему совпадению повторяться ноль или более раз
  • $ соответствует концу строки (т.е. после этой точки символы не допускаются)

Чтобы использовать выражение в программе на 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);
}
2 голосов
/ 24 февраля 2017

Еще один способ - проверить, возвращают ли 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 = "These are english 123";
        IsAllCharEnglish(str); // return true
2 голосов
/ 15 февраля 2010

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

1 голос
/ 12 сентября 2012
bool onlyEnglishCharacters = !EnglishText.Any(a => a > '~');

Кажется дешевым, но это сработало для меня, законный легкий ответ. Надеюсь, это кому-нибудь поможет.

0 голосов
/ 24 сентября 2018

Принятый ответ регулярное выражение не поддерживает пробелы или знаки пунктуации. Ниже код проверяется для этого ввода:

123 abc! ?? -_) (/ \;:

text1 = "123 abc! ?? -_)(/\\ ; :";
bool t = Regex.IsMatch(text1, "^[a-zA-Z0-9. -_?]*$")   //true

text2 = "ف";
bool f = Regex.IsMatch(text2, "^[a-zA-Z0-9. -_?]*$")    //false
0 голосов
/ 09 апреля 2018

Не используйте RegEx и LINQ, они медленнее цикла символов строки

Тест производительности

Мое решение:

private static bool is_only_eng_letters_and_digits(string str)
{
   foreach (char ch in str)
   {
      if (!(ch >= 'A' && ch <= 'Z') && !(ch >= 'a' && ch <= 'z') && !(ch >= '0' && ch <= '9'))
      {
         return false;
      }
   }
   return true;
}
0 голосов
/ 22 августа 2017
<?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!";
    }
?>
0 голосов
/ 28 сентября 2014

Как отмечали многие, принятый ответ работает, только если в строке есть одно слово. Поскольку нет ответов, которые охватывают случай нескольких слов или даже предложений в строке, вот код:

stringToCheck.Any(x=> char.IsLetter(x) && !((int)x >= 63 && (int)x <= 126));
0 голосов
/ 15 февраля 2010

Я согласен с ответами регулярного выражения. Тем не менее, вы можете упростить его до "^ [\ w] + $". \ w - это любой «символ слова» (который переводится как [a-zA-Z_0-9], если вы используете алфавит не-юникод. Я не знаю, хотите ли вы также подчеркнуть подчеркивание.

Подробнее о регулярных выражениях в .net здесь: http://msdn.microsoft.com/en-us/library/ms972966.aspx#regexnet_topic8

...