public static bool ValidatorCardId(String strCardId)
        {
            string reg = @"\d{17}[\d|X]|\d{15}";
            return ExecuteValidator(strCardId, reg);
        }  private static bool ExecuteValidator(string str, string Expression)
        {
            try
            {
                Regex r = new Regex(Expression);//创建正则表达式。
                return r.Match(str).Success;//进行验证。
            }
            catch (Exception e)
            {                log4net.LogManager.GetLogger(e.GetType()).Error("Validator(" +str + ")", e);
                return false;
            }
        }这是两个中国身份证号码验证的 方法,为什么 16位,17位,都可以成功通过验证??是不是微软自带的@"\d{17}[\d|X]|\d{15}" 这个正则表示有问题?正则高手来帮帮忙看看,欢迎大家各抒己见。。

解决方案 »

  1.   

    \d{17}[\d|X]|\d{15}
    解读一下这个正则\d 匹配任意一位数字
    {17} 十七位的
    [\d|X]
    第十八位是数字或者X
    |\d{15}
    或者是  十五位的数字怎么可能会出现 楼主所说的 可以匹配 16位 17位的情况!!!!
      

  2.   

    没写括号吧。
    ^(\d{17}[\d|X]|\d{15})$这样
      

  3.   


    都是我的错,我改成^(\d{18}[\d|X]|\d{15})$了 
      

  4.   

    不写括号的话|优先级高。就分成了
    ^\d{17}[\d|X]
    或者
    \d{15}$
      

  5.   

    这里都是星级的回复,除了我
    ^(\d{17}[\d|X]|\d{15})$
      

  6.   


    很明显理解错了。
    [\d|X]
    表示数字、大写X或是|字符。这里的|并不是或的意思。