如何验证一个字符串是否为英文?

31

我从控制台读取了一个字符串。如何确保它只包含英文字符和数字?


17
“英语字符”对你来说是什么(更不用说书写系统和语言是完全不同的概念,而英语使用拉丁字母表)?“naïve”是一个完全有效的英语单词,但它包含一个非ASCII字母。如果你的领域确实是“由英语单词组成的字符串”,那么你必须比起只是“由ASCII字母和数字组成的字符串”的情况要小心得多。 - Joey
2
有点惊讶,当“仅包含英文字符和数字”是如此模糊不清时,竟然有九个人认为这个问题“有用且清晰”。 - AakashM
@Akash:目前的要求基本上是无用的。我想不出任何合理的事情需要将字符串限制为“英文字符”(在我看来,这意味着“编写英文文本所需的字符”)。当然,这将包括标点符号、各种拉丁基字符的变体(如塞迪利亚、分音符等)以及可能的表现形式,如连字。当然,考虑到这些限制,您可以使用该字符集完美地编写许多其他欧洲语言。 - Joey
1
我认为他的意思是,只有英文字母的列表......据我所知,英语单词除了导入的单词外,不使用拉丁字母表的26个字母以外的任何其他字符。我会限制自己只使用普通英语键盘可以输入的内容,忘记éàôï和其他类似的字符。 - David Brunelle
由于目前问题的写法,答案必须将 "façade"、"naive" 等标识为英文。 - Jared Beck
1
@JaredBeck:不是的。英文单词是“facade”,拼写为C。带有c-cedilla的“façade”仅仅是一个基于英文单词的外来语。 - James Curran
13个回答

42
假设你所说的“英文字符”只是指26个拉丁字母,那么这就是一个需要使用正则表达式的领域: ^[a-zA-Z0-9 ]*$ 例如:
if( Regex.IsMatch(Console.ReadLine(), "^[a-zA-Z0-9]*$") )
{ /* your code */ }

在这种情况下,正则表达式的好处在于您真正关心的只是字符串是否匹配模式 - 这是一个正则表达式非常适用的场景。它清晰地捕捉到了您的意图,并且如果您对“英文字母”的定义超出了26个字母表中的字母,那么扩展起来也很容易。
这里有一系列不错的文章,请点击此处以了解更多关于正则表达式的知识。
Jørn Schou-Rode的答案提供了一个很好的解释,说明了这里介绍的正则表达式如何匹配您的输入。

4
你可能还需要添加空格,"a b c" 对于给定的正则表达式模式返回false。 - Fredrik Mörk
2
那么像省略号(…)或弯曲的撇号这样的花式标点符号呢?它们有自己的Unicode字符。 - Will Vousden
6
这个错误的答案错误地将ASCII与“英语”等同起来。这是极其错误的 - 正如这条评论明显表明的那样。 - tchrist

20
你可以使用这个正则表达式进行匹配:^[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);
}

5
请注意,如果输入字符串包含空格,该模式将返回false。 - Fredrik Mörk

9

被接受的答案无法处理空格或标点符号。以下代码已经过此输入测试:

Hello: 1. - a; b/c \ _(5)??
(是英文)

Regex regex = new Regex("^[a-zA-Z0-9. -_?]*$");


string text1 = "سلام";
bool fls = regex.IsMatch(text1);   //false

string text2 = "123 abc! ?? -_)(/\\;:";
bool tru = regex.IsMatch(text2);  //true

5
另一种方法是检查IsLowerIsUpper是否都不返回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

我对这个答案进行了负评,因为它在处理像俄语这样的大小写字母不区分的语言时会返回 true。 - אורי orihpt

3

不要使用正则表达式和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;
}

2

你有网路连线吗?我猜那不一定能保证,但是 Google 有一个语言 API 可以侦测你传入的语言。 Google 语言 API


1
bool onlyEnglishCharacters = !EnglishText.Any(a => a > '~');

看起来很便宜,但对我有用,是真正的简单答案。 希望能帮到任何人。


1
NULBEL和其他低端ASCII字符都小于“~” - 这使得它比必要的更加脆弱。添加一个|| a < '0',你就会更接近解决方案 :-) - Sean Vieira

0
<?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
bool AllAscii(string str)
{ 
   return !str.Any(c => !Char.IsLetterOrDigit(c));
}

15
IsLetterOrDigit 对于任何 Unicode 字母都会返回 true。不仅限于英语。我理解的对吗? - Andrii Shvydkyi
根据我的测试,它的结果是错误的。 - Mohammad Sina Karvandi
Char.IsLetterOrDigit 似乎不能区分西方字母和其他字母。在这里使用 Char.IsLetterOrDigit 是没有用的。 - Steve

0

如果你想要控制输入,可以像这样做:

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();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接