RegularExpressionValidator медленно на многострочном текстовом поле (textarea) - PullRequest
2 голосов
/ 02 декабря 2010

У меня есть многострочное текстовое поле (textarea), которое я хочу проверить, содержит определенную строку.Я пытался:

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

Использование ^(.\s*)*$, кажется, подходит для текстовой области.Поэтому я попытался определить свои критерии между двумя из них.Но похоже, что он блокирует IE и Chrome.

Это должно быть просто, я думаю, что я делаю это жестче, чем нужно.

Ответы [ 3 ]

4 голосов
/ 03 декабря 2010

Если проверка всегда выполняется на сервере (вот что означает runat="server", не так ли?), Простейшим решением, вероятно, является использование этого регулярного выражения:

(?s)^.*Content.*$

(?s) включает режим Singleline, который позволяет метасимволу . соответствовать всем символам , включая перевод строки. Если вы хотите, чтобы он также работал на клиенте, используйте это:

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

Это связано с тем, что JavaScript не имеет эквивалента для режима Singleline (также известного как DOT_ALL, DOTALL, точка-совпадения-все , однострочный или /s режим). Он также не распознает встроенные модификаторы, такие как (?s) и (?i).

Остерегайтесь конструкций типа (.\s*)*, где выражение с квантификаторами (*, + и т. Д.) Заключено в группу, которая сама управляется квантификатором. Если регулярное выражение не может сразу найти совпадение, оно возвращается и пытается сопоставить по разным путям (то есть, используя разные части регулярного выражения для сопоставления с разными частями строки), что может стать очень дорогим с точки зрения производительности. Это регулярное выражение особенно плохо, потому что . и \s могут совпадать со многими из одинаковых символов, что значительно увеличивает количество путей, которые он должен изучить, прежде чем сдаться.

Это явление широко известно как катастрофический откат , и оно обычно проявляется в тех случаях, когда нет возможности совпадения. Я ожидаю, что ваш валидатор будет работать нормально при наличии последовательности Content.

Кстати, если вы хотите найти соответствие только по полному слову Content, вы должны добавить границы слов, например:

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

Это предотвратит ложные срабатывания таких слов, как MalContent и Contentious. \b работает по-разному в разных вкусах регулярных выражений. В .NET он поддерживает Unicode, если не указан режим ECMAScript. В JavaScript предполагается, что только буквы и цифры ASCII считаются символами слова; в большинстве браузеров это так, но не принимайте это как должное.

1 голос
/ 03 декабря 2010

Попробуйте

[\S\s]*Content[\S\s]*
0 голосов
/ 02 декабря 2010

Я думаю, что регулярное выражение, более похожее на .*Content.*, будет более эффективным и, возможно, быстрее.Кроме того, вы можете захотеть реализовать пользовательский валидатор, если это по-прежнему приводит к снижению производительности, когда вы используете JavaScript для поиска текста в строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...