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