【问题标题】:What is wrong with this Regex "^(.|\s){1,280}$"这个正则表达式有什么问题 "^(.|\s){1,280}$"
【发布时间】:2010-12-17 10:58:33
【问题描述】:

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

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

【问题讨论】:

  • 超过 280 不在 1 到 280 之间。
  • 输入有多大?你能更具体地说明“挂起”吗?
  • @Gumbo 这不是重点 - 而不是失败,而是挂起,即花费了非常长的时间。
  • 在 ASP 中是否有真的没有 strlength() 函数????
  • @Spudley - 当然有 :) String.Length

标签: asp.net regex


【解决方案1】:

它本身并没有什么“错误”本身,但这很可怕,因为对于大多数 RE 引擎(你不说你使用的是哪个引擎),当它与第一个不匹配时它尝试的事情是因为它会导致引擎回溯并尝试大量不同的可能性(这些可能性都不会导致匹配)。所以这不是挂起,而只是一台试图执行大约 2280 操作以查看是否有匹配的机器。请原谅我不等了!

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

【讨论】:

  • 合并的关键是引擎能否将.\s识别为字符集并将它们合并为一个字符集。如果可以,RE 在保证线性时间内匹配变得微不足道。
  • 你认为有办法重写正则表达式来优化它吗?
  • @JAngwenyi:在我使用的引擎中,我会做^[\u0000-\uffff]{1,280}$,但我根本不会那样做(引擎也有计数限制;还有其他情况更讨厌!)你真的不能使用 RE 以外的东西来做这个验证吗?
  • 是的,我可以编写一个简单的 JavaScript 函数来进行验证。很高兴知道/理解为什么这个正则表达式“挂起”。谢谢大家!
【解决方案2】:

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

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

【讨论】:

  • . 默认不匹配换行符。
  • @codaddict 准确!这就是为什么我将两者 (.|\s) 结合起来,但在评估时它似乎挂起
  • K,我使用 asp:RegularExpressionValidator 在客户端显示警告消息
【解决方案3】:

如果你真的想使用正则表达式,你可以使用 .{1, 280}$ 结合 SingleLine 选项,这样. 元字符将匹配所有内容,包括新行(参见here,正则表达式 API 部分)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多