Если проверка всегда выполняется на сервере (вот что означает 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 считаются символами слова; в большинстве браузеров это так, но не принимайте это как должное.