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

时间:2010-02-15 13:08:12

标签: c# string character-encoding

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

13 个答案:

答案 0 :(得分:28)

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

例如:

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

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

有一个体面的series of articles here可以更多地讲授正则表达式。

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

答案 1 :(得分:16)

您可以将其与此正则表达式匹配:^[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 :(得分:2)

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

答案 3 :(得分:1)

bool onlyEnglishCharacters = !EnglishText.Any(a => a > '~');
似乎便宜,但它对我有用,合法的答案很简单。 希望它可以帮助任何人。

答案 4 :(得分:1)

另一种方法是检查IsLower和IsUpper是否都不返回true。 类似的东西:

SELECT  BDSReleaseBDDSBPD.ProjectID,
        BDSFlowDetails.Flowid,
        IterationID, 
        MAX(CASE WHEN ReleaseTask = 'BDDS' THEN UID END) AS 'BDDS UID',
        MAX(CASE WHEN ReleaseTask = 'BDDS'
                 THEN CONCAT(FirstName, '_', Lastname) END) AS BDDSReleasedBy, 
        MAX(CASE WHEN ReleaseTask = 'BDDS'
                 THEN ReleaseDate END) AS 'BDDS Released Date' ,
        MAX(CASE WHEN ReleaseTask = 'BPD' THEN UID END) AS 'BPD UID' ,
        MAX(CASE WHEN ReleaseTask = 'BPD'
                 THEN CONCAT(FirstName, '_', Lastname) END) AS BPDReleasedBy, 
        MAX(CASE WHEN ReleaseTask = 'BPD'
                 THEN ReleaseDate END) AS 'BPD Released Date' 
FROM BDSReleaseBDDSBPD 
INNER JOIN BDSFlowDetails
    ON BDSFlowDetails.FlowID = BDSReleaseBDDSBPD.FlowID 
INNER JOIN BDSUserProfile
    ON BDSUserProfile.UserName = BDSReleaseBDDSBPD.UserName 
WHERE BDSReleaseBDDSBPD.ProjectID = 861
GROUP BY BDSReleaseBDDSBPD.ProjectID,
         BDSFlowDetails.Flowid,
         IterationID 
ORDER BY BDSFlowDetails.Flowid

并使用它:

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

答案 5 :(得分:0)

bool AllAscii(string str)
{ 
   return !str.Any(c => !Char.IsLetterOrDigit(c));
}

答案 6 :(得分: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();
}

答案 7 :(得分:0)

如果我不想使用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是最好的解决方案。

答案 8 :(得分:0)

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

更多关于.net中的正则表达式:http://msdn.microsoft.com/en-us/library/ms972966.aspx#regexnet_topic8

答案 9 :(得分:0)

正如许多人所指出的,只有在字符串中只有一个单词时,接受的答案才有效。因为没有答案涵盖字符串中多个单词甚至句子的情况,所以代码如下:

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

答案 10 :(得分:0)

ssh -p $PORT -t $USER@IP  bash -c "

        while IFS='' read -r line || [[ -n "\$line" ]]; do
            echo 'Text read from file: \$line;
        done < $SAVED_CONFIGURATION
    "

答案 11 :(得分:0)

不要使用RegEx和LINQ,它们比字符串

的循环慢

Perfomance test

我的解决方案:

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

答案 12 :(得分:0)

可接受的答案正则表达式不支持空格或标点符号。下面的代码已针对此输入进行了测试:

  

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