正则表达式检查允许字符输入

时间:2015-03-12 13:46:53

标签: c# regex asp.net-mvc

我正在使用农场模型的遥控器进行数据验证并检查省代码我一直收到一个不接受两个字符的错误。我需要省代码长2个字母并检查它们是否有效实际上是字母。下面是RemoteController的代码:

public JsonResult provinceCodeCheck(string provinceCode)
{
    Regex justLetters = new Regex("^[A-Z]$");
    provinceCode.ToUpper();
    var provinceCodes = db.provinces.Find(provinceCode);

    if (provinceCode.Length != 2)
    {
        return Json("The Province must be 2 letters long",
           JsonRequestBehavior.AllowGet);
    }
    else if (!justLetters.Equals(provinceCode))
    {
        return Json("The Province is not letters",
           JsonRequestBehavior.AllowGet);
    }
    else if (provinceCodes == null)
    {
        return Json("The Province is not supported, sorry for the         inconvenience",
           JsonRequestBehavior.AllowGet);
    }
    else
    {
        return Json(true, JsonRequestBehavior.AllowGet);
    }          
}

4 个答案:

答案 0 :(得分:6)

您的代码存在一些问题:

  1. provinceCode.ToUpper()并未改变provinceCode的值。您需要指定provinceCode = provinceCode.ToUpper()

  2. !justLetters.Equals(provinceCode)正在检查Regex是否等于字符串provinceCode。您需要使用Regex.IsMatch()

    if (!justLetters.IsMatch(provinceCode))
    
  3. 最后(感谢Carnivorus在这里)你的Regex只寻找一个大写字母。如果你改变你的正则表达式,你可以将前两个if语句合并为一个:

    var justLetters = new Regex("^[A-Z]{2}$");
    
  4. 正如您的代码的一般改进一样,您也不需要在elseif使用if,因为您无论如何都会在{{1}}语句中返回。

答案 1 :(得分:4)

你不需要正则表达式,linq是你的朋友:

if(provinceCode.All(x=> Char.IsLetter(x))
{
   // valid
}

或:

if(provinceCode.Length!=2 && provinceCode.Any(x=> !Char.IsLetter(x))
{
   // not valid
}

答案 2 :(得分:4)

您的RegEx仅查找1个大写字母。您需要将^[A-Z]{2}$用于正好2个大写字母

答案 3 :(得分:1)

 provinceCode = provinceCode.ToUpper();

ToUpper()不会更改当前值,返回 ToUpper' d值