Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何验证字符串是否为英语?_C#_String_Character Encoding - Fatal编程技术网

C# 如何验证字符串是否为英语?

C# 如何验证字符串是否为英语?,c#,string,character-encoding,C#,String,Character Encoding,我从控制台读取字符串。如何确保它只包含英文字符和数字?假设“英文字符”只是指26个字符的拉丁字母表,这将是我使用正则表达式的一个领域:^[a-zA-Z0-9]*$ 例如: if( Regex.IsMatch(Console.ReadLine(), "^[a-zA-Z0-9]*$") ) { /* your code */ } 在本例中,正则表达式的好处是,您真正关心的是字符串是否与模式匹配——这是正则表达式工作得非常出色的地方。它清楚地抓住了你的意图,如果你把“英语字符”的定义扩展到26个字母

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

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

例如:

if( Regex.IsMatch(Console.ReadLine(), "^[a-zA-Z0-9]*$") )
{ /* your code */ }
在本例中,正则表达式的好处是,您真正关心的是字符串是否与模式匹配——这是正则表达式工作得非常出色的地方。它清楚地抓住了你的意图,如果你把“英语字符”的定义扩展到26个字母以外,它就很容易扩展

有一个不错的方法可以教授更多关于正则表达式的知识


Jørn Schou Rode的回答很好地解释了这里的正则表达式如何匹配您的输入。

您可以将其与此正则表达式匹配:
^[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);
}
Regex模式=新的Regex(“^[a-zA-Z0-9]*$”,RegexOptions.Compiled);
对于(int i=0;i<1000;i++)
{
字符串输入=Console.ReadLine();
pattern.IsMatch(输入);
}
类似这样的内容(如果您想控制输入):

静态字符串readlettersanddights(){
StringBuilder sb=新的StringBuilder();
ConsoleKeyInfo-keyInfo;
while((keyInfo=Console.ReadKey(true)).Key!=ConsoleKey.Enter){
char c=char.ToLower(keyInfo.KeyChar);

如果(('a'你有网络访问权限吗?我想这不能保证,但谷歌有一个语言api,可以检测你传递给它的语言。

如果我不想使用正则表达式,只是为了提供一个替代解决方案,您可以只检查每个字符的ASCII码,如果它位于该范围内,则可能是英文字母或数字(这可能不是最佳解决方案):

foreach(字符串ToCharArray()中的字符)
{ 
int x=(int)字符;

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

有关.net中正则表达式的更多信息,请参见:

看起来很便宜,但对我来说很有效,这是一个非常简单的答案。
希望它对任何人都有帮助。

正如许多人指出的那样,只有当字符串中只有一个单词时,公认的答案才有效。由于没有答案涵盖字符串中多个单词甚至句子的情况,下面是代码:

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

stringToCheck.Any(x=>char.isleter(x)&&&!((int)x>=63&&(int)x另一种方法是检查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

不要使用正则表达式和LINQ,因为它们比字符串循环慢

我的解决方案:

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
    }

} 
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;
}
private static bool仅为英文字母和数字(字符串str)
{
foreach(char-ch-in-str)
{

如果(!(ch>='A'&&ch='A'&&ch='0'&&ch接受的答案不适用于空格或标点符号。针对此输入测试以下代码:

您好:1.-a;b/c\\(5)?
(是英语)


IsLetterOrDigit适用于任何Unicode字母。不仅适用于英语。我说的对吗?根据我的测试,它的结果是错误的。Char.IsLetterOrDigit似乎无法区分西方字母和其他字母。在这里使用Char.IsLetterOrDigit是没有用的。您可能还需要包括空格;“a b c”对于给定的正则表达式模式,返回false。那么像省略号(…)或卷曲撇号这样的标点符号呢?它们有自己的unicode字符。这个错误的答案错误地将ASCII与“英语”等同起来。这是难以置信的错误-正如此注释清楚地表明的那样。“英语字符”是什么对你来说(更不用说脚本和语言是完全不同的东西,英语使用拉丁语了)?“naïve”是一个完全有效的英语单词,但它包含一个非ASCII字母。如果你的域名确实是“英语单词字符串”,那么你必须比你的意思更加小心“ASCII字母和数字字符串”。当“仅包含英文字符和数字”如此含糊不清时,九个人认为这个问题“有用且清晰”,这有点令人惊讶…@Akash:好吧,现在的要求几乎是无用的。我想不出任何合理的方法来约束字符串“英语字符”(在我看来,这意味着“书写英语文本所需的字符”)。这当然包括标点符号、各种拉丁字母的变体(cedilla、diaeresis和c)当然,考虑到这些限制,你可以很好地用这组字符书写许多其他欧洲语言。我想他说的是真的,只是一个英语字符列表……据我所知,英语单词除了使用拉丁字母表中的26个字母外,没有其他用途除了输入的单词。我不再局限于使用普通的英语键盘可以写的东西,而忘记了“facade”和其他类似的单词。@JaredBeck:不。英语单词是“facade”拼写,带有C。
    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
<?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!";
    }
?>
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;
}
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