如何validation字符串是否为英文?

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

假设通过“英文字符”你只是指26个字符的拉丁字母,这将是我将使用正则表达式的区域: ^[a-zA-Z0-9 ]*$

例如:

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

在这种情况下,正则表达式的好处在于,您真正关心的是字符串是否与模式匹配 – 这是正则表达式非常有效的方法。 它清楚地捕捉了你的意图,如果你对“英文字符”的定义超出了26个字母,那么很容易扩展。

这里有一系列不错的文章可以更多地讲述正则表达式。

JørnSchou-Rode的答案提供了一个很好的解释,说明这里呈现的正则表达式如何与您的输入相匹配。

你可以将它与这个正则表达式匹配: ^[a-zA-Z0-9]*$

  • ^匹配字符串的开头(即在此点之前不允许任何字符)
  • [a-zA-Z0-9]匹配来自az的大写字母或小写字母,以及数字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); } 

你有网络访问权限吗? 我认为无法保证,但谷歌有一种语言api,可以检测你传递给它的语言。 谷歌语言API

 bool AllAscii(string str) { return !str.Any(c => !Char.IsLetterOrDigit(c)); } 
 bool onlyEnglishCharacters = !EnglishText.Any(a => a > '~'); 

看起来很便宜,但它对我有用,合法的答案很简单。 希望它能帮助任何人。

另一种方法是检查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 

这样的事情(如果你想控制输入):

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

如果我不想使用RegEx,只是为了提供一个替代解决方案,你可以检查每个字符的ASCII码,如果它在这个范围之间,它可能是英文字母或数字(这可能不是最佳解决方案):

 foreach (char ch in str.ToCharArray()) { int x = (int)char; if (x >= 63 and x <= 126) { //this is english letter, ie- 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是最好的解决方案。

我同意正则表达式的答案。 但是,您可以将其简化为“^ [\ w] + $”。 \ w是任何“单词字符”(如果您使用非unicode字母表,则转换为[a-zA-Z_0-9]。我不知道您是否也需要下划线。

有关.net中正则表达式的更多信息,请访问: http : //msdn.microsoft.com/en-us/library/ms972966.aspx#regexnet_topic8

正如许多人所指出的那样,只有在字符串中只有一个单词时,接受的答案才有效。 由于没有答案涵盖字符串中多个单词甚至句子的情况,这里是代码:

 stringToCheck.Any(x=> char.IsLetter(x) && !((int)x >= 63 && (int)x <= 126)); 
 '; echo mb_strlen($string, 'utf-8'); echo '
'; if(strlen($string) != mb_strlen($string, 'utf-8')) { echo "Please enter English words only:("; } else { echo "OK, English Detected!"; } ?>

不要使用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; } 

接受的答案正则表达式不支持空格或标点符号。 下面的代码测试了这个输入:

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