我正在使用RegExp来验证ASP.NET网页上的一些用户输入.这是为了强制构造一个密码(即8到20个长,至少一个大写字符,至少一个小写字符,至少一个数字,至少一个字符#@!$%,没有用字母L或O(大写或小写)或数字0和1.此RegExp在我的测试程序(Expresso)和我的C#代码中工作正常.
这是它的样子:
(?-i)^(?=.{8,20})(?=.*[2-9])(?=.*[a-hj-km-np-z])(?=.*[A-HJ-KM-NP-Z]) (?=.*[#@!$%])[2-9a-hj-km-np-zA-HJ-KM-NP-Z#@!$%]*$
(为格式添加换行符)
但是,当我运行代码时,它存在于IE6或IE7中(没有尝试过其他浏览器,因为这是一个内部应用程序而且我们是Microsoft商店),我收到运行时错误,说"正则表达式中的语法错误".就是这样 - 除了行号之外,错误消息中没有更多信息.
JavaScript不喜欢这个是什么?
那么,在Javascript中有两种定义正则表达式的方法:
一个.通过Regexp对象构造函数:
var re = new RegExp("pattern","flags"); re.test(myTestString);
湾 使用字符串文字:
var re = /pattern/flags;
您还应该注意JS不支持正则表达式的一些原则.有关JS中不支持的功能的非全面列表,请查看regular-expressions.info站点.
具体来说,您似乎在表达式上设置了一些标志(例如,不区分大小写的标志).我建议您使用/i
标志(如上面的语法所示)而不是使用(?-i)
这将使您的正则表达式如下(似乎支持Positive Lookahead):
/^(?=.{8,20})(?=.*[2-9])(?=.*[a-hj-km-np-z])(?=.*[A-HJ-KM-NP-Z])(?=.*[#@!$%])[2-9a-hj-km-np-zA-HJ-KM-NP-Z#@!$%]*$/i;
有关该主题的非常好的文章,请查看JavaScript中的正则表达式.
编辑(霍华德的评论之后)
如果您只是将此正则表达式模式分配给RegularExpressionValidator控件,那么您将无法设置正则表达式选项(例如忽略大小写).此外,您将无法使用Javascript支持的Regex文字语法.因此,剩下的唯一选择是使您的模式本质上不区分大小写.例如,[a-h]
必须写成[A-Ha-h]
.这会让你的正则表达式啰嗦,我很遗憾地说.
这是这个问题的解决方案,虽然我不能保证它的合法性.我们想到的其他一些选项可能是完全关闭客户端验证并在服务器上进行验证.这将使您可以访问该System.Text.RegularExpressions.Regex
对象实现的完整正则表达式.或者,使用CustomValidator并创建自己的JS函数,该函数使用我(和其他人)建议的模式应用正则表达式匹配.