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

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

24
задан Bart 10 May 2013 в 11:39
поделиться

7 ответов

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

Например:

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

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

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

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

29
ответ дан 28 November 2019 в 23:10
поделиться

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

2
ответ дан 28 November 2019 в 23:10
поделиться

Примерно так (если вы хотите управлять вводом):

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();
}
0
ответ дан 28 November 2019 в 23:10
поделиться

Если я не хочу использовать 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 - лучшее решение.

-1
ответ дан 28 November 2019 в 23:10
поделиться

Вы можете сопоставить это с этим регулярное выражение: ^ [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);
}
16
ответ дан 28 November 2019 в 23:10
поделиться
bool AllAscii(string str)
{ 
   return !str.Any(c => !Char.IsLetterOrDigit(c));
}
0
ответ дан 28 November 2019 в 23:10
поделиться

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

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

0
ответ дан 28 November 2019 в 23:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: