使用带有正则表达式条件的RegularExpression属性验证属性始终通过

时间:2014-03-18 14:35:07

标签: c# asp.net regex attributes

我正在尝试使用RegularExpression属性中的条件来验证属性的特定格式集,但似乎只要我在模式中包含它(条件)就会通过验证。

我甚至尝试过最简单的例子,以及微软的例子(例如:@"\b(?(\d{2}-)\d{2}-\d{7}|\d{3}-\d{2}-\d{4})\b",但似乎没有任何效果(允许所有值)。

为清晰起见添加: 我需要验证税务登记号码。规则是:

if it starts with country identifier 
   for country CC do strict format check
   for all other countries allow any string
else 
  assume it's local number and do strict format check

(大部分时间注册都是本地的,规则是已知的,但应该可以输入格式未知的外国号码。)

虽然我很感激上面允许的正则表达式,但我的问题不是关于特定模式本身,而是为什么使用条件 - 在这种特殊情况下(asp.net/c#属性) - 在模式中脱离验证以及如何解决它。

2 个答案:

答案 0 :(得分:0)

condititional语句的语法是(?(?=condition)iftrue|else),所以你的正则表达式应该是

\b(?(?=\d{2}-)\d{2}-\d{7}|\d{3}-\d{2}-\d{4})\b

但在我看来,在这个例子中你不需要条件,记住(?=...)是零宽度(这里的条件是相互排斥的。)这应该足够了:

\b(?:\d{2}-\d{7}|\d{3}-\d{2}-\d{4})\b

答案 1 :(得分:0)

我错过了显而易见的事实(感谢Robin指出我实施

这是发生了什么:) 我检查.net是否支持条件(确实如此)
我将一个条件放入Regex属性,并且很高兴解析和编译。

然后,我尝试通过触发Web表单并输入乱码来检查它是否有效。当输入失去焦点时,它应该产生关于格式错误的警告信息。它没。

我忘记了这个'瞬间'客户端验证(mvc unobtrusive validation)实际上是通过由mvc模板引擎生成和嵌入的jquery / javascript代码完成的。

这意味着它实际上是与这些模式匹配的javascript。不幸的是,javascript 不支持条件所以只要它看到一个 meh