.NET Regex не работает должным образом - PullRequest
1 голос
/ 25 января 2010

У меня следующий шаблон регулярных выражений: (.NET 1.1 Regex Validator)

^(?=.*[A-Za-z])[a-zA-Z0-9@\\-_\\+\\.]{6,32}$

Мне нужно выполнить следующие требования:

от 6 до 32 символов должен содержать хотя бы одну букву. Разрешенные символы буквы (a-z, A-Z), цифры (0-9), @ (символ "at"), . (период), _ (подчеркивание), + (плюс), - (минус).

Любые записи, начинающиеся с числовых значений, кажутся «пропущенными», пока не встретятся нечисловые значения.

123abc не удается
123abcde не удается
123abcdef проходит

Итак, я вижу, что он «считает» взгляд вперед ПОСЛЕ числовых значений, почему?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 25 января 2010

Вполне возможно, что это ошибка в .NET 1.1. Все ваши "неудачные" примеры работают с использованием Regex Hero , основанного на Silverlight, который использует реализацию .NET 2.0 Regex.

Вместо этого вы можете попробовать использовать положительное утверждение и посмотреть, решит ли это проблему:

^[a-zA-Z0-9@\-_\+\.]{6,32}(?<=.*[A-Za-z])$

Редактировать: Учитывая, что это валидатор ASP.NET, вам следует дважды убедиться, что он не проходит проверку клиента (javascript). Некоторые расширенные функции (например, просмотр вперед / назад нулевой ширины) не поддерживаются некоторыми браузерами.

Попробуйте отключить проверку на стороне клиента, установив EnableClientScript на false на RegularExpressionValidator и посмотрите, решит ли это проблему. Если это так, то это проблема поддержки браузера, и я бы рекомендовал разделить вашу проверку на две части:

  1. ^[a-zA-Z0-9@\-_\+\.]{6,32}$ # must be 6-32 characters
  2. ^.*[A-Za-z].*$ # must contain a letter
1 голос
/ 30 января 2010

Вы пробовали рефакторинг регулярного выражения? Например:

^(?=[a-zA-Z0-9_@+.-]{6,32}$).*[A-Za-z].*$

Или просто «дополняйте» свою точку зрения, чтобы она соответствовала полностью до конца:

^(?=.*[A-Za-z].*$)[a-zA-Z0-9_@+.-]{6,32}$

Возможно, это приведет к сбросу позиции совпадения, чтобы вторая часть могла начать сопоставление в начале. Конечно, в этом нет необходимости, но я не вижу никакой причины, по которой ваше регулярное выражение не будет работать так, как написано.

0 голосов
/ 25 января 2010

Он рассчитывает прогноз после цифр, потому что вы позволили столько же с

(?=.*[A-Za-z])

.* означает «после нуля или более символов».

Если вы хотите использовать букву в начале, измените ваш шаблон:

^[A-Za-z][-a-zA-Z0-9@_+.]{5,31}$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...