Средство проверки регулярных выражений MVC3 - «Синтаксическая ошибка в регулярных выражениях» - PullRequest
1 голос
/ 04 ноября 2011

Я пытаюсь добавить атрибут "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)^((.))+$.*$"

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

Ответы [ 2 ]

4 голосов
/ 04 ноября 2011

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

1 голос
/ 04 ноября 2011

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

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