将“最大长度”添加到正则表达式

时间:2012-12-17 22:56:12

标签: c# regex

如何使用一个属性来扩展已存在的正则表达式,该属性告诉正则表达式不能超过最大长度(假设)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 个答案:

答案 0 :(得分: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})(\]?)

我也觉得有责任告诉你,你的正则表达很糟糕,你应该心疼。

答案 1 :(得分:1)

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

如果您正在使用ASP.NET验证程序,则可以使用RangeValidator。

如果你正在使用自定义验证功能,那么在你对它进行复杂的正则表达式之前检查长度会更加可读(并且更快)。

答案 2 :(得分:0)

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

但如果你真的必须,你需要让你的角色可选,所以像:

.?{255}

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

答案 3 :(得分:0)

您“可以”按照以下方式使用预测:

^(?=.{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})(\]?)$