我必须验证一个应该包含小时数字的字符串(例如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 :(得分:2)
此模式可行。我遇到了same thing。它与使用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);
}
答案 1 :(得分:0)
试试这个:
[RegularExpression("2[0-3]|[01]?[0-9]", ErrorMessage = "Error")]
public string JobStartHour {...}
答案 2 :(得分: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");
}
}
}
答案 3 :(得分:0)
您必须将|
分组才能正常工作。
我成功尝试了,这应该是你的正则表达式,但是分组并限制为start&端:
^([01]?[0-9]|2[0-3])$
您的指定Regex.IsMatch
行在我的计算机上的每个表达式上都返回true。