Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.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验证西班牙语DNI吗#_C#_Validation - Fatal编程技术网

C# 有人能帮我用C验证西班牙语DNI吗#

C# 有人能帮我用C验证西班牙语DNI吗#,c#,validation,C#,Validation,我正在做一个C#项目,包括表和用户管理。在我的自定义控件文本框中,我需要验证用户是否引入了有效的西班牙语DNI。 DNI格式为8个数字和1个字母。如果用户按此顺序键入8个以上的数字或一个以上的字母(12345678A),则该方法无法写入。 如果有人能帮助我,我将非常感激!谢谢你的阅读 我尝试过这个正则表达式方法,但不起作用 private void ValidateText(对象发送者,按键事件参数e) { 字符串模式=@“^((\d{8})|(\d{8}([A-Z]|[A-Z]))$”; 正则

我正在做一个C#项目,包括表和用户管理。在我的自定义控件文本框中,我需要验证用户是否引入了有效的西班牙语DNI。 DNI格式为8个数字和1个字母。如果用户按此顺序键入8个以上的数字或一个以上的字母(12345678A),则该方法无法写入。 如果有人能帮助我,我将非常感激!谢谢你的阅读

我尝试过这个正则表达式方法,但不起作用

private void ValidateText(对象发送者,按键事件参数e)
{
字符串模式=@“^((\d{8})|(\d{8}([A-Z]|[A-Z]))$”;
正则表达式r=新正则表达式(模式);
if((r.IsMatch(this.Text)))
{
e、 已处理=正确;
}
}

对于这样一个简单的规则,您不需要使用正则表达式。 使用下面的方法

public static bool ValidateSpanishDNI(string value)
{
    if(value == null) return false;
    if(value.Length != 9) return false;
    if(char.IsLetter(value[8]) == false) return false;
    for(int i = 0; i < 8; i++) {
        if(char.IsDigit(value[i]) == false)
            return false;

    }

    return true;
}
公共静态bool validatePanishdni(字符串值)
{
if(value==null)返回false;
如果(value.Length!=9)返回false;
if(char.isleter(值[8])==false)返回false;
对于(int i=0;i<8;i++){
if(char.IsDigit(值[i])==false)
返回false;
}
返回true;
}

这里有一个使用Linq的替代解决方案

string value = this.Text;
int outInt = 0;

int numbersCount = value.Count(c => Char.IsNumber(c));
e.Handled = ( (numbersCount == 8) && 
              (value.Length - numbersCount == 1) &&
             !(int.TryParse(value[value.Length - 1].ToString(), out outInt))
             );

正则表达式不工作怎么办?我在dotnetfiddle中使用了您的精确正则表达式,它似乎工作得很好

有几件事需要注意:

  • 此正则表达式适用于
    12345678A
    A12345678
    。这是你的意图吗
  • 您不需要执行
    [A-Z]|[A-Z]
    。您只需使用
    [A-Za-z]
    即可(如下所示)
string模式=@“^(([A-Za-z])\d{8})|(\d{8}([A-Za-z]))$”;

请参阅这个源于您的代码的示例作为参考,如果您有任何问题,请告诉我


这是否回答了您的问题?编辑后,正则表达式现在检查字符串是8位,还是8位后跟a-Z范围内的字母,但不是,比如说,包含K和W,这两个字母不在自然的西班牙语字母表中(尽管由于外来词而被包括在许多字符中)。此代码检查最后一个字符是否为数字,其余字符是否为字母,但OP需要相反的字符。我不知道如何检查字符串是否以字母结尾。是的,刚刚删除:)有这样的要求吗?哦,刚刚注意到。我会更新这个。是的。“DNI(Documento Nacional de Identiidad):这是西班牙公民的身份证号码。DNI格式为8位数字,后跟一个字母(例如12345678A)。相同的号码用于驾驶执照。”更新了答案。