RegularExpressionValidator slow on multiline textbox (textarea)
我有一个多行文本框(textfarea),我想验证其中是否有特定的字符串。我在尝试:
使用^(.\s*)*$似乎可以通过文本区域。所以我试着把我的标准夹在两个标准之间。但它似乎锁定了IE和Chrome。
这应该很简单,我想我让它变得比需要的更难。
如果验证总是在服务器上进行(这就是runat="server"的意思,不是吗?)最简单的解决方案可能是使用这个regex:
(?s)打开Singleline模式,允许.元字符匹配包括换行在内的所有字符。如果希望它也在客户端上运行,请使用以下命令:
这是因为javascript没有与Singleline模式(也称为DOT_ALL、DOTALL、dot匹配all、单行或/s模式)等效的功能。它也不识别内联修饰符,如(?s)和(?i)。
注意像(.\s*)*这样的结构,其中一个带有量词的表达式(*、+等)封闭在一个量词本身控制的组中。如果regex不能立即实现匹配,它会返回并尝试通过不同的路径进行匹配(即,使用regex的不同部分来匹配字符串的不同部分),这会导致非常昂贵的性能方面的问题。这个regex尤其糟糕,因为.和\s可以匹配许多相同的字符,这显著增加了放弃之前必须探索的路径数量。
这种现象通常被称为灾难性的回溯,通常出现在不可能匹配的情况下。我希望您的验证器在序列Content出现时工作正常。
顺便说一下,如果您只想匹配完整的单词Content,您应该添加单词边界,如下所示:
这样可以防止像MalContent和Contentious这样的词出现误报。\b在不同的regex口味下工作方式不同。在.NET中,除非指定ECMAScript模式,否则它是Unicode感知的。在JavaScript中,它应该只将ASCII字母和数字识别为单词字符;在大多数浏览器中,它是这样做的,但并不认为它是理所当然的。
- 答案很棒。我使用了[ss]选项,因为我希望它也在客户端上运行(runat="server"表示服务器必须解释标记,enableClientscript="false"只在服务器上运行)。
尝试
我认为更像.*Content.*的regex更有效,可能更快。另外,如果这仍然是一个性能上的拖累,那么您可能需要实现一个自定义验证器,在这里您可以使用javascript搜索字符串的文本。
- 不起作用。句号不换行,这就是为什么我要包括空格。我可以做一个自定义验证器,但这就像是另外八行代码一样:)