regex - RegularExpression属性的.NET ComponentModel.DataAnnotations 问题

  显示原文与译文双语对照的内容
0 0

我必须验证一个字符串,它应该包含一个小时数( 比如 。 00到 23 ) 。

因此,我设置了如下注释:


 [RegularExpression("[01]?[0-9]|2[0-3]", ErrorMessage ="Error")]
 public string JobStartHour {...}

很遗憾,这个 正规表达式 与 20到 23的输入不匹配,因为它应该做( 恕见谅) 。

这里 RegularExpression 属性是否使用普通的旧 Regex.IsMatch?


Regex.IsMatch("22","[01]?[0-9]|2[0-3]")

返回 true 。

我知道,使用字符串来存储数字不是最好的想法,但是这个问题很烦人,所以这个问题很烦人。

时间: 原作者:

0 0

这个 Pattern 会工作。我遇到了同样的事情。 它与使用parens正确建立分组有关。 如果RegExAttribute不能解决它似乎只是在管道符号上退出。

这是一个 单元测试 。


 [TestMethod]
 public void CheckHours()
 {
 var pattern ="([0-1][0-9])|(2[0-3])|([0-9])";
 int cnt = 0;

 var hours = new string[]
 {"1","2","3","4","5","6","7","8","9",
"01","02","03","04","05","06","07","08","09",
"10","11","12","13","14","15","16","17","18","19",
"20","21","22","23" };

 var attribute = new RegularExpressionAttribute(pattern);
 bool isMatchOk = false;
 bool isAttrOk = false;

 foreach (var hour in hours)
 {
 isMatchOk = System.Text.RegularExpressions.Regex.IsMatch(hour, pattern);
 isAttrOk = attribute.IsValid(hour);

 if (isMatchOk & isAttrOk)
 { cnt += 1; }
 else
 { Debug.WriteLine(hour +"/" 
 + isMatchOk.ToString() +"/"
 + isAttrOk.ToString()); }
 }

 Assert.AreEqual(32, cnt);
 }

0 0

尝试这个:


[RegularExpression("2[0-3]|[01]?[0-9]", ErrorMessage ="Error")]
 public string JobStartHour {...}

0 0

不知道为什么这个 正规表达式 没有正确解释,但是解决方案是实现一个 CustomValidation插件,这非常方便。


 [CustomValidation(typeof(MyCustomValidation),"Validate24Hour")]
 public string JobStartHour {...}

...

 public class MyCustomValidation
 {
 public static ValidationResult Validate24Hour(string candidate)
 {
 bool isValid = false;
. . .
 if (isValid)
 {
 return ValidationResult.Success;
 }
 else
 {
 return new ValidationResult("Error");
 }
 }
 }

原作者:
0 0

你必须将 | 分组才能正常工作。

我成功地尝试过,应该是你的正规表达式,但分组并限制为启动&结束:


^([01]?[0-9]|2[0-3])$

你的命名 Regex.IsMatch 行在我的机器上的每个表达式上返回 true 。

原作者:
...