2010-12-17 83 views
1

应该验证1-280个输入字符,但是当超过280个字符输入时它会挂起。

澄清 我使用上述正则表达式来验证输入字符串的长度为280个字符的最大值。 我使用asp:RegularExpressionValidator来做到这一点。

+0

超过280不在1到280之间(含)。 – Gumbo 2010-12-17 11:03:04

+0

输入有多大?你能更具体地说“挂起”吗? – dheerosaur 2010-12-17 11:04:14

+0

@Gumbo这不是重点 - 而不仅仅是失败,它是悬而未决的,即花费时间过长。 – 2010-12-17 11:04:39

回答

4

没有什么“错误”的程度本身的,但它是可怕的,因为与大多数RE引擎(你不说你使用的是哪一个)时,它不会尝试,因为第一件事匹配它会导致引擎回溯并尝试加载不同的可能性(其中任何一种都不会导致匹配)。所以这不是一个悬念,而只是一个试图执行大约2 操作的机器,以查看是否有匹配成为可能。对不起,如果我不等待!

当然,RE编译器在理论上有可能将RE的(.|\s)部分合并到它不需要回溯处理的部分中。一些RE引擎会这样做(通常是更多的自动机理论),但很多不会(基于堆栈的)。

+0

合并的关键在于引擎是否可以识别'.'和'\ s'都是字符集,并将它们合并为一个集合。如果可以的话,RE在保证线性时间内变得微不足道。 – 2010-12-17 11:12:00

+0

你认为有一种方法可以重新编写正则表达式来优化它吗? – 2010-12-17 11:13:13

+0

@Jngngyiyi:在我使用的引擎中,我会做'^ [\ u0000- \ uffff] {1,280} $',除非我不这样做(引擎也有计算限制;还有其他的情况更加糟糕!)你真的不能使用除RE之外的其他东西来进行验证吗? – 2010-12-17 11:16:28

0

它试图找到.\s的每种可能组合,试图找到与字符串匹配的模式版本。

.已经匹配任何字符,所以(.|\s)是多余的。此外,如果你只是想检查字符串的长度,那么就是这样做 - 你为什么要拉出正则表达式?

+2

'.'默认情况下不会匹配换行符。 – codaddict 2010-12-17 11:05:57

+0

@codaddict exaclty!那为什么我结合了两个(。| \ s),但它似乎在评估 – 2010-12-17 11:11:36

+0

K时挂起,我正在使用asp:RegularExpressionValidator在客户端显示警告消息 – 2010-12-17 11:17:34

0

如果你真的要使用正则表达式,你可以使用.{1, 280}$SingleLine选项组合,使.元字符将匹配一切,包括新线(见here,正则表达式API部分)。

相关问题