我有以下正则表达式模式:(.NET 1.1 Regex Validator)
^(?=.*[A-Za-z])[a-zA-Z0-9@\\-_\\+\\.]{6,32}$
我需要满足以下要求:
6到32个字符
必须至少包含一个字母。
允许的字符是
字母(a-z, A-Z)
,
数字(0-9)
,
@
(“at”符号),
.
(期间),
_
(下划线),
+
(加),
-
(减号)。
任何以数值开头的条目似乎都被“跳过”,直到遇到非数字值。
123abc
失败了
123abcde
失败了
123abcdef
传递
所以我看到它在计算数字值之后的前景,为什么?
感谢。
答案 0 :(得分:2)
很可能它是.NET 1.1中的一个错误。所有“失败”示例都使用Regex Hero,它基于使用.NET 2.0 Regex实现的Silverlight。
您可以尝试使用正面的 look-behind 断言,看看是否可以解决问题:
^[a-zA-Z0-9@\-_\+\.]{6,32}(?<=.*[A-Za-z])$
编辑:考虑到这是一个ASP.NET验证程序,您应该仔细检查它是否未通过客户端验证(javascript)。某些浏览器不支持某些高级功能(如零宽度前视/后视)。
尝试通过在EnableClientScript
上将false
设置为RegularExpressionValidator
来禁用客户端验证,看看是否能解决问题。如果是,那么这是一个浏览器支持问题,我建议将验证分为两个:
^[a-zA-Z0-9@\-_\+\.]{6,32}$ # must be 6-32 characters
^.*[A-Za-z].*$ # must contain a letter
答案 1 :(得分:1)
您是否尝试过重构正则表达式?例如:
^(?=[a-zA-Z0-9_@+.-]{6,32}$).*[A-Za-z].*$
或者只是“填充”你的前瞻,所以它必须一直匹配到最后:
^(?=.*[A-Za-z].*$)[a-zA-Z0-9_@+.-]{6,32}$
也许这会重置匹配位置,因此第二部分可以在开始时开始匹配。当然,这不应该是必要的,但我看不出为什么你的正则表达式无法按照书面形式工作的原因。
答案 2 :(得分:0)
它计算数字之后的前瞻,因为你允许使用
(?=.*[A-Za-z])
.*
表示“在零个或多个字符之后。”
如果你想在开头强制写一封信,请修改你的模式:
^[A-Za-z][-a-zA-Z0-9@_+.]{5,31}$