Aspx RegularExpressionValidator在客户端和服务器上的工作方式不同

时间:2011-04-18 14:02:59

标签: javascript asp.net regex validation

我在 RegularExpressionValidator 的正则​​表达式上运行客户端时遇到了一些问题:

(?=.{8,})(?=.*[A-Z])(?=.*[\d])(?=.*[\W])|(?=.*[a-z])(?=.*[\d])(?=.*[\W])|(?=.*[A-Z])(?=.*[a-z])(?=.*[\W])|(?=.*[A-Z])(?=.*[a-z])(?=.*[\d])

如果提供的字符串

,则该表达式应该返回true
  • 至少包含八个字符
  • 在四组中的三组中至少有一个字符“小写字母”/“大写字母”/“数字”/“特殊字符”

在C#(.NET 3.5)中使用此表达式直接返回不同测试字符串的预期结果,但在客户端浏览器中,有效字符串(例如aaaaBBB1)不起作用。

我已经阅读了thread here,所以解释是客户端使用的JavaScript与.NET实现相比略有不同。

现在我尝试在JavaScript中运行我的正则表达式来验证上面链接的线程中的参数,但在JavaScript中,我的正则表达式也与C#中的相同。

还有另一种方法可以让RegularExpressionValidator工作吗?我不明白为什么JavaScript有效(我预计它不会在阅读有关实现差异之后),但是RegularExpressionValidator没有。

提前感谢任何指向正确方向的指示。

-G。

1 个答案:

答案 0 :(得分:1)

尝试以下方法:

^(?:(?=.*[A-Z])(?=.*\d)(?=.*\W)|(?=.*[a-z])(?=.*\d)(?=.*\W)|(?=.*[A-Z])(?=.*[a-z])(?=.*\W)|(?=.*[A-Z])(?=.*[a-z])(?=.*\d)).{8,}$

你的正则表达式允许长度超过8的字符串传递,因为长度断言只是第一次交替的一部分。

然后(这可能是问题)你的正则表达式永远不会匹配任何文本,它只做断言。因此,我在字符限制之外采用了“长度正则表达式”并使其成为实际匹配。

这应该适用于JavaScript和.NET。