这个正则表达式有什么问题“^(。| \ s){1,280} $”

时间:2010-12-17 10:58:33

标签: asp.net regex

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

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

3 个答案:

答案 0 :(得分:4)

本身没有什么“错误”,但是它很可怕,因为大多数RE引擎(你没有说你正在使用哪一个)当它与第一个不匹配时它尝试的东西,因为它导致引擎回溯并尝试不同的可能性(没有一个可以导致匹配)。所以这不是一个悬念,而是一台试图围绕2 280 操作执行以查看是否存在匹配的机器。如果我不等待,请原谅我!

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

答案 1 :(得分:0)

正在尝试为每个字符尝试.\s的每种可能组合,以寻找与字符串匹配的模式版本。

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

答案 2 :(得分:0)

如果确实想要使用正则表达式,则可以将.{1, 280}$SingleLine选项结合使用,以便.元字符符合所有内容,包括新行(请参阅here,正则表达式API部分)。