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

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个回答

0
如果我不想使用正则表达式,而只是提供另一种解决方案,你可以检查每个字符的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://zh.wikipedia.org/wiki/ASCII 获取完整 ASCII 表。

但我仍然认为,正则表达式是最佳解决方案。


2
这个错误的答案错误地将ASCII与“英语”混淆了。 - tchrist

0

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

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


0

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

stringToCheck.Any(x=> char.IsLetter(x) && !((int)x >= 63 && (int)x <= 126));

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