应该验证1-280个输入字符,但是当超过280个字符输入时它会挂起。
澄清 我使用上述正则表达式来验证输入字符串的长度为280个字符的最大值。 我使用asp:RegularExpressionValidator来做到这一点。
应该验证1-280个输入字符,但是当超过280个字符输入时它会挂起。
澄清 我使用上述正则表达式来验证输入字符串的长度为280个字符的最大值。 我使用asp:RegularExpressionValidator来做到这一点。
没有什么“错误”的程度本身的,但它是可怕的,因为与大多数RE引擎(你不说你使用的是哪一个)时,它不会尝试,因为第一件事匹配它会导致引擎回溯并尝试加载不同的可能性(其中任何一种都不会导致匹配)。所以这不是一个悬念,而只是一个试图执行大约2 操作的机器,以查看是否有匹配成为可能。对不起,如果我不等待!
当然,RE编译器在理论上有可能将RE的(.|\s)
部分合并到它不需要回溯处理的部分中。一些RE引擎会这样做(通常是更多的自动机理论),但很多不会(基于堆栈的)。
合并的关键在于引擎是否可以识别'.'和'\ s'都是字符集,并将它们合并为一个集合。如果可以的话,RE在保证线性时间内变得微不足道。 – 2010-12-17 11:12:00
你认为有一种方法可以重新编写正则表达式来优化它吗? – 2010-12-17 11:13:13
@Jngngyiyi:在我使用的引擎中,我会做'^ [\ u0000- \ uffff] {1,280} $',除非我不这样做(引擎也有计算限制;还有其他的情况更加糟糕!)你真的不能使用除RE之外的其他东西来进行验证吗? – 2010-12-17 11:16:28
它试图找到.
和\s
的每种可能组合,试图找到与字符串匹配的模式版本。
.
已经匹配任何字符,所以(.|\s)
是多余的。此外,如果你只是想检查字符串的长度,那么就是这样做 - 你为什么要拉出正则表达式?
'.'默认情况下不会匹配换行符。 – codaddict 2010-12-17 11:05:57
@codaddict exaclty!那为什么我结合了两个(。| \ s),但它似乎在评估 – 2010-12-17 11:11:36
K时挂起,我正在使用asp:RegularExpressionValidator在客户端显示警告消息 – 2010-12-17 11:17:34
如果你真的要使用正则表达式,你可以使用.{1, 280}$
与SingleLine
选项组合,使.
元字符将匹配一切,包括新线(见here,正则表达式API部分)。
超过280不在1到280之间(含)。 – Gumbo 2010-12-17 11:03:04
输入有多大?你能更具体地说“挂起”吗? – dheerosaur 2010-12-17 11:04:14
@Gumbo这不是重点 - 而不仅仅是失败,它是悬而未决的,即花费时间过长。 – 2010-12-17 11:04:39