7

我如何扩展已经存在的正则表达式的属性,告诉正则表达式不能超过(比方说)255 的最大长度?

我有以下正则表达式:

([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)

我试过这样,但失败了:

{.,255([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)}

4

4 回答 4

12

如果它必须是一个完全基于正则表达式的解决方案,那么最好的方法是使用环视。

查看此示例:http ://regex101.com/r/yM3vL0

我在这里所做的只是匹配最多三个字符长的字符串。当然,以我为例,这不是最好的方法。但忽略这一点,我只是想展示一个对你有用的例子。

您还必须锚定您的模式,否则引擎将忽略环视(我是否必须深入解释这一点?)

换句话说,您可以在正则表达式中使用以下内容将其限制为最多 255 个字符:

^(?!^.{256})([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)

我也觉得我有责任告诉你你的正则表达式很糟糕,你应该感到难过。

于 2012-12-17T23:16:25.870 回答
1

正则表达式并不是真正用来解决所有问题的。在这种情况下,我建议测试 255 的长度会很昂贵,因为这将需要基础表示中的 255 个状态。相反,只需单独测试字符串的长度。

但如果你真的必须,你需要让你的角色是可选的,比如:

.?{255}

将匹配 255 个或更少字符的任何字符串。

于 2012-12-17T23:01:36.193 回答
1

为什么不检查字符串的最大长度呢?如果您使用 DataAnnotations,您可以在属性上粘贴 [StringLength(255)]。

如果您使用的是 ASP.NET 验证器,则可以使用 RangeValidator。

如果您使用的是自定义验证函数,那么在对它抛出复杂的正则表达式之前检查长度会更易读(也更快)。

于 2012-12-18T01:00:33.090 回答
1

您“可能”能够使用如下的前瞻:

^(?=.{0,255}$)your regex here$

所以...

^(?=^.{0,255}$)([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$
于 2012-12-18T01:50:25.857 回答