RegularExpressionValidator всегда терпит неудачу, но ValidationExpression работает в тестировании - PullRequest
3 голосов
/ 22 мая 2010

Я нашел ответ на этот вопрос, но это немного странно, поэтому я хотел поделиться им здесь.

У меня есть регулярное выражение, которое проверяет пароли. Они должны содержать от 7 до 60 символов, по крайней мере, с одним цифровым и одним буквенным символом. Довольно стандартный. Я использовал положительные взгляды (оператор (? = ) для его реализации:

(?=^.{7,60}$)(?=.*[0-9].*)(?=.*[a-zA-Z].*)

Я проверил это выражение в своих модульных тестах, используя Regex.IsMatch () , и оно работало нормально. Однако, когда я использую его в RegularExpressionValidator, он всегда терпит неудачу. Почему?

Ответы [ 2 ]

4 голосов
/ 22 мая 2010

Странно, что я никогда не сталкивался с этим раньше, но оказывается, что RegularExpressionValidator не использует Regex.IsMatch или JavaScript Regex.test () - он проверяет совпадение захватаэто точно соответствует полной проверенной стоимости.Вот соответствующий код JS:

var rx = new RegExp(val.validationexpression);
var matches = rx.exec(value);
return (matches != null && value == matches[0]);

Так что, если выражение - все упреждающие слова (которые соответствуют позициям, а не фактическому тексту), оно завершится ошибкой.Это более понятно с примером выражения, которое только частично соответствует, например, с \ d {5} , значение «123456» завершится ошибкой.Дело не только в том, что он добавляет «^ $» вокруг вашего выражения и выполняет IsMatch.Ваше выражение на самом деле должно захватить.

Исправление в моем случае это выражение:

(?=^.{7,60}$)(?=.*[0-9].*).*[a-zA-Z].*
1 голос
/ 22 мая 2010

Вы пробовали

(?=^.{7,60}$)(?=.*[0-9].*)(?=.*[a-zA-Z].*).+
//                                        ^^

? Регулярному выражению нужно что-то потреблять.

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