.NET Regex不能正常工作

时间:2010-01-25 19:48:13

标签: .net regex validation

我有以下正则表达式模式:(.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传递

所以我看到它在计算数字值之后的前景,为什么?

感谢。

3 个答案:

答案 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来禁用客户端验证,看看是否能解决问题。如果是,那么这是一个浏览器支持问题,我建议将验证分为两个:

  1. ^[a-zA-Z0-9@\-_\+\.]{6,32}$ # must be 6-32 characters
  2. ^.*[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}$