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