MVC RegularExpressionAttribute.Тестирование на повторные символы regexp не работает - PullRequest
0 голосов
/ 09 февраля 2012

Мне нужно проверить, что поле содержит повторяющиеся символы (более трех).Я использую регулярное выражение в RegularExpressionAttribute, но оно не работает.Например,

  • pattern: ([a-zA-Z]) \ 1 {2}
  • input: abcdddf
  • результат: нет совпадения!

в атрибуте исходного кода имеет следующий код:

public override bool IsValid(object value)
{
    this.SetupRegex();
    string str = Convert.ToString(value, CultureInfo.CurrentCulture);
    if (string.IsNullOrEmpty(str))
    {
        return true;
    }
    Match match = this.Regex.Match(str);
    return ((match.Success && (match.Index == 0)) && (match.Length == str.Length));
} 

Если вместо строки

return ((match.Success && (match.Index == 0)) && (match.Length == str.Length));

было только

return match.Success;

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

Ответы [ 2 ]

1 голос
/ 09 февраля 2012

Вы можете использовать положительный прогноз в своем регулярном выражении:

(?=.*([a-zA-Z])\1{2}).*

Выражение выше соответствует всей строке (.*), но только если где-то в строке есть повторяющиеся символы ((?=.*([a-zA-Z])).

0 голосов
/ 09 февраля 2012

Проблема в том, что вы возвращаете true, только если вся строка состоит из ровно трех идентичных символов.Из-за ваших дополнительных проверок валидация ведет себя точно так же, как ^([a-zA-Z])\1{2}$.

Подход

return match.Success;

- это тот, который вы должны использовать.
В качестве альтернативы вы также можете изменить свое регулярное выражение следующим образомthis:

^.*([a-zA-Z])\1{2}.*$

Или, если вы хотите сопоставить строку, в которой есть другие символы между повторяющимися, вы можете использовать этот шаблон:

^.*([a-zA-Z])(.*\1){2}.*$

Редактировать:
Поскольку этот вопрос касается регулярного выражения для RegularExpressionAttribute, факт, который я как бы упустил из виду при ответе, весь первый абзац можно игнорировать.

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