我正在尝试在我的MVC应用程序中使用数据注释验证,并启用了不引人注意的客户端验证。
然而,问题在于.NET和JavaScript的Regex语法不同。因此,如果我使用符合.NET语法的正则表达式在我的模型属性上使用正则表达式验证注释,则相同的正则表达式字符串将被转移到data-val-regex
属性中的客户端,并用于使用客户端验证的JavaScript。
因此,我最终使用.NET样式的正则表达式来验证使用JavaScript。这导致验证在客户端和服务器端的行为方式不同。
有解决方法吗?
答案 0 :(得分:2)
简而言之,JavaScript正则表达式弱。很弱。
您可以比较this site(和链接页面)上的所有差异,但基本上只限于:
. | [] [^] [x-y] () (?:)
+ * ? {n,} {n,m}
*? +? ?? {n,}? {n,m}?
\w \d \s
等的ASCII范围^ $ \b
\1
(没有命名组)(?=) (?!)
(对不起,根本没有看守)\uXXXX
(无Unicode属性)g i m y
(无s
- 使用[\s\S]
作为解决方法)并且......就是这样。
如果你的.NET正则表达式只使用这些功能,你会没事的。但有一个例外:.NET使用\w \d \s
的Unicode属性,等等,而JavaScript使用ASCII,所以你应该使用[0-9]
而不是\d
来获得完全相同的结果。< / p>
但是如果您的.NET正则表达式使用更多功能,则必须为受影响的正则表达式禁用客户端时间验证,或者编写自定义JS验证程序。
答案 1 :(得分:0)
ASP.NET为RegExp对象添加了糖,允许命名您的组和其他东西。如果您希望相同的正则表达式在后端和前端有效,那么请考虑使用纯JavaScript regexp。此工具可以帮助您构建所需的正则表达式: http://www.regexr.com/
在ASP.Net中,您需要转义反斜杠字符,或使用"@"
指定文字字符串。即。
//using string literal notation
var re1 = new System.Text.RegularExpressions.Regex(@"^(http:)|(\/+)");
//or escaping the backslash
var re2 = new System.Text.RegularExpressions.Regex("^(http:)|(\\/+)");