【问题标题】:RegularExpressionValidator slow on multiline textbox (textarea)多行文本框(textarea)上的RegularExpressionValidator慢
【发布时间】:2010-12-02 16:27:08
【问题描述】:

我有一个多行文本框 (textarea),我想验证其中是否包含特定字符串。我正在尝试:

<asp:RegularExpressionValidator runat="server" ControlToValidate="txtTemplate" ValidationExpression="^(.\s*)*Content(.\s*)*$" Text="content" ErrorMessage="Must contain: Content" />

使用^(.\s*)*$ 似乎传递了一个文本区域。所以我试图将我的标准夹在其中两个之间。但它似乎锁定了 IE 和 Chrome。

这应该很简单,我想我让它变得比需要的更难。

【问题讨论】:

    标签: asp.net regex validation


    【解决方案1】:

    如果验证总是在服务器上完成(这就是runat="server" 的意思,不是吗?),最简单的解决方案可能是使用这个正则表达式:

    (?s)^.*Content.*$
    

    (?s) 开启Singleline 模式,允许. 元字符匹配所有字符包括换行符。如果您也希望它在客户端上运行,请使用以下命令:

    ^[\s\S]*Content[\s\S]*$
    

    这是因为 JavaScript 没有 Singleline 模式的等效项(也称为 DOT_ALLDOTALLdot-matches-all单行、或/s 模式)。它也不识别像(?s)(?i) 这样的内联修饰符。

    注意像(.\s*)* 这样的结构,其中带有量词的表达式(*+ 等)包含在一个组中,该组本身由一个量词控制。如果正则表达式无法立即实现匹配,它会返回并尝试通过不同的路径进行匹配(即,通过使用正则表达式的不同部分来匹配字符串的不同部分),这可能会变得非常昂贵,性能方面。这个正则表达式特别糟糕,因为.\s 可以匹配许多相同的字符,这大大增加了它在放弃之前必须探索的路径数量。

    这种现象通常被称为catastrophic backtracking,它通常出现在不可能匹配的情况下。当序列Content 存在时,我希望您的验证器能够正常工作。

    顺便说一句,如果您只想匹配完整的单词Content,您应该添加单词边界,如下所示:

    (?s)^.*\bContent\b.*$
    

    这将防止像 MalContentContentious 这样的词出现误报。 \b 在不同的正则表达式风格中的工作方式不同。在 .NET 中,除非您指定 ECMAScript 模式,否则它可以识别 Unicode。在 JavaScript 中,它应该只将 ASCII 字母和数字识别为单词字符;在大多数浏览器中确实如此,但不要认为这是理所当然的。

    【讨论】:

    • 很棒的答案。我使用了 [\s\S] 选项,因为我希望它也可以在客户端运行(runat="server" 意味着服务器必须解释标签,EnableClientScript="false" 只会在服务器上运行它) .
    【解决方案2】:

    试试

    [\S\s]*Content[\S\s]*
    

    【讨论】:

      【解决方案3】:

      我认为更像.*Content.* 的正则表达式会更有效并且可能更快。此外,如果这仍然是性能拖累,您可能需要实现自定义验证器,您可以使用 JavaScript 在文本中搜索字符串。

      【讨论】:

      • 不起作用。该句点不包含换行符,这就是我包含“\s”(空格)的原因。我可以做一个自定义验证器,但这就像另外八行代码:)
      猜你喜欢
      • 2012-06-29
      • 1970-01-01
      • 2012-11-19
      • 2012-08-09
      • 1970-01-01
      • 2011-10-28
      • 2010-10-26
      • 1970-01-01
      • 2023-03-06
      相关资源
      最近更新 更多