Средство проверки регулярных выражений MVC3 — «Синтаксическая ошибка в регулярном выражении»

#jquery #regex #asp.net-mvc-3 #model-view-controller #validation

#jquery #Регулярное выражение #asp.net-mvc-3 #модель-представление-контроллер #Проверка

Вопрос:

Я пытаюсь добавить атрибут «RegularExpression» к свойству в ViewModel

 [RegularExpression(@"^(?=^.{8,}$)(?=.*d)(?=.*W )(?=.*[a-z])(?=.*[A-Z])(?i-msnx:(?!.*pass|.*password|.*word|.*god|.*s))(?!^.*n)^((.)) $.*$", ErrorMessage = "Password does not meet requirements.")]
public string NewPassword { get; set; }
  

Когда происходит проверка, я получаю следующее исключение из Visual Studio:

 Microsoft JScript runtime error: Syntax error in regular expression
  

Это то же самое точное регулярное выражение, которое я определяю в web.config при определении поставщика членства:

 passwordStrengthRegularExpression="^(?=^.{8,}$)(?=.*d)(?=.*W )(?=.*[a-z])(?=.*[A-Z])(?i-msnx:(?!.*pass|.*password|.*word|.*god|.*s))(?!^.*n)^((.)) $.*$"
  

Может кто-нибудь сказать мне, почему я получаю эту ошибку при использовании регулярного выражения в атрибуте модели?

Комментарии:

1. Что не так god ?

Ответ №1:

JScript — это версия ECMAScript от Microsoft, которая поддерживает чрезвычайно ограниченный набор функций регулярных выражений по сравнению с .NET. Ваша самая большая проблема в том, что он не поддерживает встроенные модификаторы, такие как (?i:xyz) . Также, похоже, нет способа передавать модификаторы отдельно, как вы могли бы, если бы вы использовали C # или JScript напрямую. Если вы хотите исключить вещи без учета регистра, вы немного облажались.

Также имейте в виду, что сокращения символьного класса похожи d и W имеют разные значения на сервере (.NET), чем на клиенте (JScript). Если вы хотите, чтобы регулярное выражение работало одинаково с обеих сторон, вы можете быть более конкретными. Вот пример, разбитый для наглядности:

 ^
(?=S{8,}$)           # eight or more non-whitespace characters
(?=.*[0-9])           # at least one digit
(?=.*[a-z])           # at least one lowercase letter
(?=.*[A-Z])           # at least one uppercase letter
(?=.*[^A-Za-z0-9])    # at least one non-letter, non-digit
(?!.*(?:pass|word|god|PASS|WORD|GOD))
. $
  

Как вы можете видеть, я исключаю только все строчные или все прописные версии pass , word , и т.д., Что на самом деле не является удовлетворительным. Если вам действительно нужно исключить или потребовать, чтобы целые слова не учитывали регистр, вам, возможно, придется использовать другой тип средства проверки.

Ответ №2:

Я думаю, что проблема, которую вы видите, заключается в том, что часть регулярного выражения не поддерживается в Javascript. Я подозреваю i-msnx: , но я ни в коем случае не эксперт по регулярным выражениям. Я рекомендую вам сократить регулярное выражение пополам, пока ошибка не исчезнет, чтобы вы могли сузить его.