RegularExpressionValidator问题限制文本框中的最大字符数

时间:2014-01-04 00:16:58

标签: asp.net validation

ASP.NET 4.5 / c#

我一直在使用RegularExpressionValidator来显示如下所示的多行文本框:

<asp:RegularExpressionValidator
ID="rev_txtEducationProfessional_courseDescription"
runat="server"
Display="None"
ValidationGroup="educationProfessional"
ControlToValidate="txtEducationProfessional_courseDescription"
ValidationExpression="(\s|.){0,500}$"
ErrorMessage="Course Description: 500 characters maximum"
EnableClientScript="false" />

直到现在我还没有遇到任何问题,但是我有一个恕我直言,非常奇怪。因此,如果我在文本框中执行类似501字母X的操作,则验证器会触发。如果我输入499个带有几个回车符的字母Xs,验证器就会被罚款。一位用户今天联系了我,网站上有一个问题。我将问题追溯到多行文本框的验证器。用户提交的字符超过500个,但网站在验证时会挂起并崩溃。当我在调试中运行时,挂起的是Page.Validate(您可能已经猜到了,我所有的验证都是服务器端)。我将提供导致问题的文本。我应该注意,如果我在这个文本中粘贴最多500个字符,一切都很好......一旦我点击501,我的网站就会转储。这个文本有一些特定的东西,结合我如何验证,“(\ s |。){0,500} $”,这是非常错误的,但我对于确切的问题是遗失的。不用多说,这是我身边的荆棘:


结合使用强烈的潜在印刷比较实践练习的摩擦山脊识别的科学基础的详细讲座。讲座材料包含了大卫·阿什巴尔的道德学概念与PAT WERTHEIM开发的实用应用技术。

识别脊柱模式,识别皮肤的手指或哪个区域产生特别的潜在印象。 3级水平细节的正确使用。比较和识别潜在打印的哲学和ACE-V方法。


我尝试删除连字符。此外,文本来自Word,所以我尝试复制到记事本中删除任何特殊格式,并尝试删除回车。通常,该网站将运行几分钟,然后说没有特定错误,该页面不可用。我只是在调试中尝试过并且一直在等待看似永远的东西以获得响应。如果有任何有用的话,我会添加。如果我做了一些明显错误的事情,或者我可以通过修改正则表达式来解决这个问题,我很好奇。

全部谢谢!

2 个答案:

答案 0 :(得分:3)

不确定是否有其他人会遇到此问题,但我已经多次引用此RegEx来验证文本框长度:

ValidationExpression = “(\ S |。){0500} $”

修复方法是使用它:

ValidationExpression = “^ [\ S \ s]的{1500} $”

我不是正则表达的专家,但找到了一篇非常有帮助的老帖子。

  

您正在经历的病理病例的原因,通常被称为“灾难性”或“超线性”回溯。回溯如此昂贵(计算上)的原因是与点匹配的字符和“\ s”重叠(“\ s”匹配的不仅仅是换行符),在这种情况下会导致回溯时要考虑的选择点数量以接近指数的速度爆炸。所以,它不是一个无限循环,但它可能需要一段时间才能完成(如果您的服务器或客户端在此之前没有崩溃或死亡,这很可能)。一些正则表达式库(如PCRE)对允许避免此类情况的回溯步骤数设置了一个硬性限制,但这并没有真正解决问题。

http://regexadvice.com/forums/thread/37591.aspx

排除故障这是一个令人沮丧的问题。希望这有助于有人在路上。

小心。

答案 1 :(得分:0)

是的,这可能是catastrophic backtracking。使用正则表达式(使用.Net API或RegularExpressionValidator),您应该始终关注Best Practices for Regular Expressions in the .NET Framework

作为一般建议,尝试重写你的正则表达式模式(之前的答案可能解决了这个问题)。当您对“最坏情况”场景中的正则表达式模式的性能有疑问时,使用RegexBuddy之类的工具进行测试。

作为缓解措施,您还可以向验证程序添加超时(MatchTimeout属性,以毫秒为单位)。此related post还讨论了如何全局配置超时。