关于多线文本框(textarea)上的asp.net:RegularExpressionValidator慢

RegularExpressionValidator slow on multiline textbox (textarea)

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

1
 

使用^(.\s*)*$似乎可以通过文本区域。所以我试着把我的标准夹在两个标准之间。但它似乎锁定了IE和Chrome。

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


如果验证总是在服务器上进行(这就是runat="server"的意思,不是吗?)最简单的解决方案可能是使用这个regex:

1
(?s)^.*Content.*$

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

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

这是因为javascript没有与Singleline模式(也称为DOT_ALLDOTALL、dot匹配all、单行或/s模式)等效的功能。它也不识别内联修饰符,如(?s)(?i)

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

这种现象通常被称为灾难性的回溯,通常出现在不可能匹配的情况下。我希望您的验证器在序列Content出现时工作正常。

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

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

这样可以防止像MalContentContentious这样的词出现误报。\b在不同的regex口味下工作方式不同。在.NET中,除非指定ECMAScript模式,否则它是Unicode感知的。在JavaScript中,它应该只将ASCII字母和数字识别为单词字符;在大多数浏览器中,它是这样做的,但并不认为它是理所当然的。


尝试

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


我认为更像.*Content.*的regex更有效,可能更快。另外,如果这仍然是一个性能上的拖累,那么您可能需要实现一个自定义验证器,在这里您可以使用javascript搜索字符串的文本。